Spring AOP 剖析(4)
Spring AOP 的实现机制
?
?
Spring AOP 的设计哲学也是简单而强大的。 它不打算将所有的 AOP 需求全部囊括在内,而是要以有限的 20% 的 AOP
?
支持,在满足 80% 的 AOP 需求。 如果觉得 Spring AOP 无法满足你所需要的那 80% 之外的需求,那么可以求助于
?
AspectJ 来完成, Spring AOP 对 AspectJ 提供了很好的集成。
?
?
Spring AOP 属于第二代 AOP, 采用动态代理机制和字节码生成技术实现。与最初的 AspectJ 采用编译器将横切逻辑织入
?
目标对象不同,动态代理机制和字节码生成都是在运行期间为目标对象生成一个代理对象,而将横切逻辑织入到这个代理对象
中,系统最终使用的是织入了横切逻辑的代理对象,而不是真正的目标对象。
?
1.? 动态代理机制
?
关于代理模式:
?
在这个场景中,Client 想要请求具体的 SubjectImpl 实例,但是 Client 无法直接请求真正要访问的资源 SubjectImpl
?
而是必须通过 ISubject 资源的访问代理类 SubjectProxy 进行。
?
Spring AOP 本质上就是采用这种代理机制实现的, 但是,还有点差别。
?
?
这是因为, 系统中可不一定就 ISubject 的实现类有 request() 方法, IRequestable 接口以及相应实现类可能也有
?
request() 方法, 它们也是我们需要横切的关注点。
?
?
为了能够为 IRequestable 相应实现类也织入以上的横切逻辑, 我们又得提供对应的代理对象
?
?使用继承的方式来扩展对象定义,也不能像静态代理模式那样,为每个不同类型的目标对象都创建相应的扩展子类。
?
所以,需要借组与 CGLIB 这样的动态字节码生成库,在系统运行期间动态的为目标对象生成相应的扩展子类。
?
package prx.aop.proxy;import net.sf.cglib.proxy.Enhancer;public class Client {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Requestable.class);enhancer.setCallback(new RequestCallback());Requestable proxy = (Requestable) enhancer.create();proxy.request();}}?
RequestCallback 实现了对 request() 方法请求进行访问控制的横切逻辑。 然后通过 CGLIB 的 Enhancer 为
?
目标对象动态地成成一个子类,并将 RequestCallback 中的横切逻辑附加到该子类中。
?
?
通过为 enhancer 指定需要生成的子类对应的父类,以及 Callback 实现, enhancer 最终生成了需要的代理对象实例。
?
使用 CGLIB 对类进行扩展的唯一限制就是 无法对 final 方法进行覆写。
?
?
?
以上两种技术(即:动态代理 与 动态字节码生成) 就是 Spring AOP 所使用的核心技术。 也就是 Spring AOP 的
?
Weaving And Weaver 的实现原理了。