• 战五渣系列之八(绝杀AOP)


    开发不用aop。程序猿的人生该会浪费多少时间。我想是时候让程序猿打败alpha狗了。程序猿解救世界。

    1.概念

    面向切面编程。这意味着,一切不在流水线上的东西。包含权限、日志、缓存、校验、资源、事物..都能够附加,并且不须要改动源码。假如你的业务是一条线,我们不在业务线上写一行代码就能完毕附加任务。我们会把代码写在其它的地方。通过2种技术手段来切入你的业务代码!是的,眼下仅有2种而已!

    2.实现方式

    基于动态代理实现 :表现形式为Spring AOP。在程序执行的时候。Spring 会为目标类动态的生成一个代理类来解决问题,由于他控制了程序执行的的入口和出口,决定怎样去实例化一个组件,所以假设你想要为公司开发一套框架,便于统一的资源訪问,监控等等等。仅仅要控制住入口和出口就可以,细节慢慢附加。是的,开发框架就这么简单!

    结果截图:

    这里写图片描写叙述

    实现截图:

    这里写图片描写叙述

    //Spring Aop 代码实现:
    public class  UserServiceProxy implements IUserService {
        public UserService userService;
        public UserServiceProxy(UserService userService){
            this.userService = userService;
        }
        @Override
        public String getName(){
            return "beautiful " + userService.getName();
        }
    };
    
    IUserService userService = new UserServiceProxy(new UserService());
    
    // 当然了,在真正的代码中UserServiceProxy 还继承了 java.lang.reflect.Proxy 类,这就决定了使用JDK的动态代理仅仅能代理接口而不能代理类。由于 extends 仅仅能使用一次!这时候就该cglib上场了。

    基于静态织入实现:表现形式为Aspectj。

    即,在代码执行的时候,我们须要增强的代码已经插入了目标类源码中。

    关键点在于什么时候?

    我们知道Spring 控制了组件的生命周期。所以在代码执行的时候创建了一个代理。那么aspectj呢,由于在代码执行的时候,增强代码已经进入目标类!所以,aspectj必须在其它阶段有所行动!一个 .java 文件由编译器编译为class、通过classloader载入到内存中、然后交给容器(比如:Spring)执行。aspectj提供了一个编译器插件解决问题!

    假设让你来呢?骚年,make a different!你能够使用自己的类载入器来实现!请原谅我使用 .aj 而不是annotation来装逼!

    (aspectj支持的两种语法)

    结果截图:

    这里写图片描写叙述

    实现截图:

    这里写图片描写叙述

    这里写图片描写叙述

    能够看到UserService的源码经过aspectj的编译器编译后事实上已经改变了。

    aspectj 的功能很强大,能够为一个类添加实现接口。加入属性,从而改变类的机构。可是在Web项目中,我们基本都是用Spring Aop来开发。aspectj不但须要一个特殊的编译器来编译代码,并且功能过于强大,我们却并不须要!

    而Spring 提供给我们的。学习一个表达式就足够了。他仅仅是实现了aspectj的部分功能而已!

    毫无疑问。aspectj在Android端正大放异彩!

    鉴于大部分移动端小伙伴并未接触过Aop开发。

    3.渣渣总结

    我们的目标是:没有蛀牙。(剥离业务)
    实现的方式是:动态代理(执行时)、静态织入(编译时、载入时)。

    so,听说Android前一段时间流传着热修复这个概念,既然client已经发出去了,编译阶段已经不可能。你猜他们是用一个框架搞动态代理还是写了一个类载入器呢?

    so,听说他们要为每一个方法做BeanValidator验证!

    so,听说他们想要为全部接口做一个统一的信息出口!

    so,听说他们要为每一个getXX方法提供30分钟数据缓存!

    so,听说他们要在业务代码中加入日志统计功能!

    so。听说他们要在client做埋点!

    我还听说。你没绝杀AOP。

    留言告诉我,秒杀!

  • 相关阅读:
    各种颜色的英文代码
    颜色代码简集
    [转]怎么成为优秀的软件模型设计者
    控件禁用
    jQuery图片播放插件ColorBox使用方法
    5个好玩的在线HTML5游戏【部分附源码下载】
    各大网站架构总结笔记(续)
    Web开发基础务实之《ASP.NET战役完胜表彰晚会(一)》
    iview Form自动跳转到校验不通过的地方
    C++与Java比较
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7189956.html
Copyright © 2020-2023  润新知