看这个注解
org.springframework.aop.config.AopConfigUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
注入AnnotationAwareAspectJAutoProxyCreator该bean
看看类图结构:发现是个BeanPostProcessor
注册前只有3个
发现开启注解后多了一个bpp
发现执行完后又注册了4个bpp.
docreateBean走完生命周期倒数第二步的时候还是原始对象
说明动态代理肯定在最后一步:applyBeanPostProcessorsAfterInitialization
遍历我们刚刚注入的8个bpp,主要是第四个动态代理的核心逻辑
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
判断当前的bean是否需要代理
寻找所有Advisor
org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator#findEligibleAdvisors
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors
是否还记的bean的生命周期第一步,
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator#shouldSkip
会遍历所有的advisor然后放入缓存供后续使用
从刚刚的缓存中拿到后返回advisors
最后会加一个系统的advisor
寻找到后回去创建代理对象
就这样代理对象就创建好了。
总结:开启该注解@EnableAspectJAutoProxy会注入一个AnnotationAwareAspectJAutoProxyCreator bpp,before会解析所有的advisor放入缓存中,after会根据bean来创建代理对象