有了Ioc基础之后,Aop理解起来会轻松许多。Aop是在CreateBean的阶段对目标Bean的方法进行增强。
1.创建切面并注册到容器(切面不需要被增强)
createBean --> resolveBeforeInstantiation --> applyBeanPostProcessorsBeforeInstantiation -->
postProcessBeforeInstantiation --> shouldSkip --> findCandidateAdvisors --> buildAspectJAdvisors
这个过程发生在 BeanFactoryAspectJAdvisorsBuilder 该类为 AnnotationAwareAspectJAutoProxyCreator 的一个属性,它会遍历容器中所有的Bean,找到所有的切面类,找到所有的通知并用map缓存起来。由于,AnnotationAwareAspectJAutoProxyCreator 是Ordered的实例,该后置处理器会在第二梯队对Bean的实例化进行修饰。
遍历后置处理器,并应用postProcessBeforeInstantiation(),其中与Aop相关的核心处理器是AnnotationAwareAspectJAutoProxyCreator 这个类实现了SmartInstantiationAwareBeanPostProcessor,他会找到所有Bean中那些事切面类,原理就是判断Bean上面是否带有@Aspect注解,而Aspect本身并不能由Spring容器管理,所以还需要给切面类接上@Component注解。
2.创建Aop增强类
follow the trace createBean --> resolveBeforeInstantiation --> applyBeanPostProcessorsAfterInitialization --> wrapIfNecessary
applyBeanPostProcessorsAfterInitialization 会调用 applyBeanPostProcessorsBeforeInstantiation前面解析好的切面和通知用于在此处增强。
getAdvicesAndAdvisorsForBean //获取到前面解析出来的advice
createProxy --> 创建proxyFactory --> proxyFactory.getProxy(getProxyClassLoader())
一路跟进去就会来到真正创建代理的方法中
由于没有接口,无法满足jdk动态代理,此处会使用cglib代理。生成了代理类,当调用原始类的方法的时候就会用代理类的业务去代替原始方法的逻辑