AOP是spring中重要的一个组件,今天看了下AOP代理生成的过程,做了简单的记录,留作日后查看。
spring在完成对bean的装配后,在暴露到工厂前,会对进行实例化。
在这个过程中可以看到spring对bean生命周期控制的几个用户可以定制的步骤:
BeanPostProcessor.postProcessBeforeInitialization->InitializingBean.afterPropertiesSet->BeanPostProcessor.postProcessAfterInitialization
我们可以通过实现这几个接口来实现对bean不同阶段的一个定制,spring的AOP就通过BeanPostProcessor.postProcessAfterInitialization阶段介入。可以看出spring面向组件编程的思想。
spring会扫描BeanPostProcessor实现,在此进行处理。我们关注对注解方式实现的Aspect。
如果当前bean需要被代理,则会生成代理 bean,对我们真正的bean进行包装。
这里会从所有的advice中匹配出适合当前bean的advice,如果找到这些advice,就需要该 bean进行封装,即:创建代理。
下面看下,spring筛选advice的过程。
找出合适的advisor和advice。但该方法并无实际操作,而是直接调用了其他方法。
首先列出spring中所有advice,然后匹配能够应用的。
此处advice分了两类进行遍历匹配,不知道为什么Advisor会分为两类,客官有知道的请指教(后面也会再看这个问题)。使用注解的aspect不属IntroductionAdvisor。
取出切入点,做最后的判断。
真正的决策者出现了,看看spring到底是怎么来断定该Advice是否符合当前的bean。
可以看到,spring为了判断该bean是否能够应用该advice,查了当前bean实现的所有接口,但最终判断还是根据当前实例的某个实现方法是否满足匹配规则(比如:实例的某个复写方法上加上了自定义Aspect注解),如果满足,就认为该bean需要加入该advice。即:该类需要做代理类进行封装。