springboot学习:Aop源码记录之@EnableAspectJAutoProxy注解和AnnotationAwareAspectJAutoProxyCreator类
1、@EnableAspectJAutoProxy
@Import(AspectJAutoProxyRegistrar.class);给容器导入AspectJAutoProxyRegistrar
利用AspectJAutoProxyRegistrar自定义给容器注册bean
internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
给容器中注册AnnotationAwareAspectJAutoProxyCreator;
2、AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator的继承关系
->AspectJAwareAdvisorAutoProxyCreator
->AbstractAdvisorAutoProxyCreator
->AbstractAutoProxyCreator
->implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
后置处理器(在bean初始化完成前后运行)、自动装配BeanFactory
需要关注的几个方法:
AbstractAutoProxyCreator.setBeanFactory();
AbstractAutoProxyCreator的后置处理方法:
postProcessBeforeInstantiation();
postProcessAfterInitialization();
AbstractAdvisorAutoProxyCreator.setBeanFactory() -> initBeanFactory();
AnnotationAwareAspectJAutoProxyCreator.initBeanFactory();
3、流程
3.1、传入配置类,创建ioc容器;
32、注册配置类,调用refresh()刷新容器
AnnotationConfigApplicationContext
3.3、registerBeanPostProcessors(beanFactory);注册bean的后置处理器来方便拦截bean的创建
AnnotationConfigApplicationContext().refresh()方法的528行
3.3.1、先获取ioc容器已经定义了的需要创建对象的所有BeanPostProcessor
AbstractApplicationContext.registerBeanPostProcessors()方法的第703行
3.3.2、给容器注入其他的BeanPostProcessor
PostProcessorRegistrationDelegate.registerBeanPostProcessors()方法的第204行
3.3.3、优先注册实现了PriorityOrdered接口的BeanPostProcessor
3.3.4、再给容器注册实现了Ordered接口的BeanPostProcessor
3.3.5、注册没有实现优先级接口的BeanPostProcessor
3.3.6、注册internalConfigurationAnnotationProcessor(为例),实际上是创建ConfigurationClassPostProcessor对象,保存在容器中
AbstractBeanFactory.getBean()方法的第202行
AbstractBeanFactory).doGetBean()方法的第302行
AbstractAutowireCapableBeanFactory.createBean()方法的第483行
3.3.6.1、创建Bean的实例
AbstractAutowireCapableBeanFactory.doCreateBean()方法的508行
3.3.6.2、populateBean:给bean的属性赋值
3.3.6.3、initializeBean:初始化bean;
AbstractAutowireCapableBeanFactory.doCreateBean()方法第553行
3.3.6.3.1、invokeAwareMethods();Aware接口的方法回调
AbstractAutowireCapableBeanFactory.initializeBean()方法第1615方法
3.3.6.3.2、applyBeanPostProcessorsBeforeInitialization();应用后置处理器的postProcessorsBeforeInitialization
AbstractAutowireCapableBeanFactory.initializeBean()第1620行
3.3.6.3.3、invokeInitMethods执行自定义初始化
AbstractAutowireCapableBeanFactory.initializeBean()第1624行
3.3.6.3.4、applyBeanPostProcessorsAfterInitialization;执行后置处理器的postProcessAfterInitialization方法
AbstractAutowireCapableBeanFactory.initializeBean()第1633行
3.3.6.4、BeanPostProcessor(ConfigurationClassPostProcessor)创建成功;
3.3.7、把BeanPostProcessor注册到BeanFactory中;
PostProcessorRegistrationDelegate.registerBeanPostProcessors()方法第251行
3.4、finishBeanFactoryInitialization(beanFactory)完成BeanFactory初始化工作;创建剩下的bean
AbstractApplicationContext.refresh()方法的第543行
3.4.1、遍历获取容器中所有bean,依次创建对象getBean(beanName);
getBean->doGetBean()->getSingleton()
DefaultListableBeanFactory.preInstantiateSingletons()方法的第761行
DefaultListableBeanFactory().getBean()方法的第197行
DefaultListableBeanFactory().doGetBean()方法的第243行
3.4.2、创建bean
[AnnotationAwareAspectJAutoProxyCreator在所有bean创建之前会有一个拦截,InstantiationAwareBeanPostProcessor,会调用postProcessBeforeInstantiation方法]
3.4.2.1、先从缓存中获取当前bean,如果能获取,说明bean是之前被创建过的,直接使用,否则再创建;
DefaultListableBeanFactory().doGetBean()方法的第243行
3.4.2.2、createBean();创建bean;AnnotationAwareAspectJAutoProxyCreator回去再任何bean创建之前返回对象的实例
[BeanPostProcessor是在Bean对象创建完成初始化前后调用的]
[InstantiationAwareBeanPostProcessor是在创建bean实例之前尝试用后置出器返回对象的]
AbstractBeanFactory.doGetBean()方法的第306行
3.4.2.2.1、resolveBeforeInstantiation(beanName, mbdToUse);解析BeforeInstantiation
希望后置处理器在此能返回一个代理对象;如果能返回代理对象就使用,如果不能继续
AbstractAutowireCapableBeanFactory.createBean()方法的第473行
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
拿到所有后置处理器;如果是InstantiationAwareBeanPostProcessor;执行>postProcessBeforeInstantiation方法
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
3.4.2.2.2、doCreateBean(beanName, mbdToUse, args);真正去创建一个bean实例和3.6一样
AbstractAutowireCapableBeanFactory.createBean()方法的第483行