0%

Spring源码 AOP代理流程

AOP是spring中重要的一个组件,今天看了下AOP代理生成的过程,做了简单的记录,留作日后查看。

spring在完成对bean的装配后,在暴露到工厂前,会对进行实例化。

bean工厂完成对bean的IOC后

在这个过程中可以看到spring对bean生命周期控制的几个用户可以定制的步骤:
BeanPostProcessor.postProcessBeforeInitialization->InitializingBean.afterPropertiesSet->BeanPostProcessor.postProcessAfterInitialization
我们可以通过实现这几个接口来实现对bean不同阶段的一个定制,spring的AOP就通过BeanPostProcessor.postProcessAfterInitialization阶段介入。可以看出spring面向组件编程的思想。

执行bean后置处理器

spring会扫描BeanPostProcessor实现,在此进行处理。我们关注对注解方式实现的Aspect。

应用各个后置处理器

如果当前bean需要被代理,则会生成代理 bean,对我们真正的bean进行包装。

判断是否需要生成代理

这里会从所有的advice中匹配出适合当前bean的advice,如果找到这些advice,就需要该 bean进行封装,即:创建代理。

执行代理的生成

下面看下,spring筛选advice的过程。
找出合适的advisor和advice。但该方法并无实际操作,而是直接调用了其他方法。

找出合适的advisor

首先列出spring中所有advice,然后匹配能够应用的。

匹配过程

此处advice分了两类进行遍历匹配,不知道为什么Advisor会分为两类,客官有知道的请指教(后面也会再看这个问题)。使用注解的aspect不属IntroductionAdvisor。

执行遍历匹配

取出切入点,做最后的判断。

取出切入点准备判断

真正的决策者出现了,看看spring到底是怎么来断定该Advice是否符合当前的bean。
可以看到,spring为了判断该bean是否能够应用该advice,查了当前bean实现的所有接口,但最终判断还是根据当前实例的某个实现方法是否满足匹配规则(比如:实例的某个复写方法上加上了自定义Aspect注解),如果满足,就认为该bean需要加入该advice。即:该类需要做代理类进行封装。

匹配切入点

进一步理解AOP,请戳我 译-Spring-理解AOP代理

小生不才,以上如有描述有误的地方还望各位不吝赐教 !^_^!