AOP,面向切面编程。
在不改动代码的前提下,灵活的在现有代码的执行顺序前后,添加进新规机能。
来一个简单的Sample:
目标类:
advice:只以Around advice为例
编织切入关系的配置文件:
Sample的启动:
以上代码,用customerServiceProxy代理CustomerService的执行
在customerServiceProxy的配置中,定义了用hijackAroundMethodBean作为方法拦截器,在hijackAroundMethodBean中利用invoke方法,拦截住所有的方法调用,塞入自己的逻辑业务。
上面看到的是Spring的Sample。
其实,Spring的AOP也是调用了其他开源技术实现。
比较常用的是JDK自己的Proxy,和开源的CGLIB
两者的区别,Proxy需要Advice必须从接口继承过来。如果切入的目标物是实体类,则无法使用。
CGLIB则可以用于直接覆盖实体类的方法。
Spring对以上两种都有支持。
Spring在配置文件中,通过ProxyFactoryBean编织和实现了切面的构成。
我们在执行以下这行话的时候
CustomerService cust = (CustomerService) appContext
.getBean("customerServiceProxy");
其实是将动态对象的生成委托给了ProxyFactoryBean
当配置文件中 的class属性配置的实现类是FactoryBean时,通过getBean方法返回的不是FactoryBean本身,而是 FactoryBean#getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean()方 法。
执行顺序如下:
1. ProxyFactoryBean中的getObject
2. ProxyFactoryBean中的initializeAdvisorChain
从配置文件中的advice list中取得interceptorNames,并将其加入advisorChain