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容器;

在这里插入图片描述

3.2、注册配置类,调用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.3.6一样

AbstractAutowireCapableBeanFactory.createBean()方法的第483行
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值