代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器
在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时判断是否有对bean对象切入的通知,如果有则生成代理对象
那么【AnnotationAwareAspectJAutoProxyCreator】这个类是如何放到后置处理器的集合中的呢?
带着疑问我跟了下【org.springframework.beans.factory.support.AbstractBeanFactory#getBeanPostProcessors】发现【org.springframework.beans.factory.support.AbstractBeanFactory#beanPostProcessors】是一个集合,所以我找到了【java.util.List#add(E)】方法来继续跟踪
源头是【org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors】
实际上是获取bean名称,通过bean名称来获取bean对象,最后注册该bean对象为后置处理器,那么这个bean名称是从哪里获取的呢?
源头是【org.springframework.beans.factory.ListableBeanFactory#getBeanNamesForType(java.lang.Class<?>, boolean, boolean)】,那么继续跟踪这个方法,有一个叫做【org.springframework.aop.config.internalAutoProxyCreator】的bean名称,就是通过这个bean名称生成的【AnnotationAwareAspectJAutoProxyCreator】,那么这个bean名称到底是哪来的呢?
跟踪得知是通过【org.springframework.beans.factory.support.DefaultListableBeanFactory#beanDefinitionNames】获得的
找到该集合的add方法所在的方法打断点后跟踪后得知实际上是通过【org.springframework.context.annotation.AspectJAutoProxyRegistrar】注册进去的
那么【org.springframework.context.annotation.AspectJAutoProxyRegistrar】又是如何触发的呢?经过跟踪在springboot启动后解析自动配置时去递归寻找【@Import】注解里导入的类并进行处理