正文
今天的问题是,Spring使用的什么样的技术实现的AOP,每种技术的特点是什么?是静态代理还是动态代理?如果让你实现AOP的功能可以使用哪几种的方式。
代理模式:是程序设计中的一种设计模式。所谓的代理者是指一个类别可以作为被代理的对象的执行者。(属于结构型的设计模式)
Spring的AOP的实现:他的实现一共采取了2种方式,第一个是SpringAOP(也即是自己实现的),还有一个就是采用AspectJ实现的。都是实现AOP的功能,他们之间有什么区别的?首先,Spring自己的实现的AOP采用的是JDK或者CGlib动态代理实现的,然而AspectJ实现的AOP采用的是静态代理实现的。这是他们实现的根本区别!!!!
显而易见,根据上面的实现方式,可以知道,JDK的代理采用的是继承Proxy类的方式实现,所以必须面向接口的实现。然而CGlib采用的是实现类的方式,所以不需要被代理对象实现接口或者拥有接口类。采用AspectJ实现的就比较特殊了,它实际上直接采用静态的代理方式实现的,也就是说直接修改.class编译好的代码,就是修改机器码的方式实现的。
如果自己想实现,如何实现呢?实际上Java为我们提供了一个组件
Instrumentation
可以采用这个组件帮助我们在服务运行的时候,动态的修改二进制编译后的代码。(实际上阿里巴巴的Arthas的底层原理就是这样实现的,帮助我们解决在没有日志的情况下,实现打印请求参数、响应结果以及抛出的异常)