AOP源码解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源码从入门到精通(十九)

上篇文章主要讲了AOP的@EnableAspectAutoProxy注解,里面导入的类和执行的后置处理器:

AOP源码解析(1)---Spring源码从入门到精通(十八)

阅读本篇文章,一定要先阅读上篇文章,运行的源码是基于上篇文章的代码,才方便理解,如果跳着阅读,感觉内容生涩,概不负责。

1、首先传入配置类到annocationConfigApplicationContext,创建ioc容器。

2、之后注册配置类,调用refresh(),刷新容器。

3、registerBeanPostProcessor方法注册bean后置处理器,来拦截bean的创建。

1)、先按类型获取ioc容器中beanPostProcessor所有的组件。

2)、给容器中加别的BeanPostProcessor。

3)、优先注册实现PriorityOrdered接口的BeanPostProcessor。

4)、next给容器中注册实现ordered接口的beanPostProcessor。

5)、注册没实现优先级接口的BeanPostProcessor。

6)、注册BeanPostProcessor,就是创建此对象,放入IOC容器。

那么如何创建internalAutoProxyCreator类型的对象[AnnotationAwareAspectJAutoProxyCreator]?

  1. 创建bean的实例。
  2. Populate()bean填充赋值。
  3. Initializetion初始化bean(流程):
  1. invokeAwareMethods调用aware方法,处理实现aware接口的方法回调。
  2. applyBeanPostProcessorBeforeInitialazation方法里的postProcessBeforeInitialization,后置处理器的调用。
  3. invokeInitMethods执行初始化方法。(@Bean注解指定初始化类)
  4. applyBeanPostProcessorAfterInitialazation方法里的postProcessAfterInitialization,后置处理器的调用。
  5. beanPostProcessor(例子:AnnotationAwareAspectJAutoProxyCreator)创建成功。

7)、吧BeanPostProcessor注册到BeanFactory中。

debugger代码可以看到:

一、下图可以看到,AnnocationConfigApplicationContext调用refresh()刷新。

二、点进去之后,有registerBeanPostProcessors方法,从注解可以看到,是注册组件后置处理器,拦截组件创建。

三、点进registerBeanPostProcessors方法,通过类型getBeanNamesForType获取到了internalAutoProxyCreator,这个组件就是在@EnableAspectJAutoProxy注解的,里面AspectJAutoProxyRegietrar类创建的组件。通过internalAutoProxyCreator定义信息,创建AnnotationAwareAspectJAutoProxyCreator组件。

四、然后用addBeanPostProcessor添加后置处理器。

五、下面建立了两个beanPsotProcessor的list集合,从注解可以看到,分离separate分别继承了PriorityOrdered,ordered,和the rest的组件。

 六、吧前面的list遍历,用beanFactory.getBean获取bean。

七、点进去之后可以看到createBean方法,是不是很熟悉,之前文章讲的bean生命周期就是调用这个方法。

八、  点进doCreateBean方法,可以看到调用populate填充赋值beanPostProcess,之后再调用initializaebean方法。

九、点进去可以看到invokeAwareMethods,调用aware方法。

分别在invokeInitMethods初始化bean之前,调用postProcessBeforeInitialization方法,和初始化之后调用postProcessAfterInitialization方法,里面都是循环ioc容器里beanPostProcessrs,存在则后置处理器则调用,若为null,则直接返回。

十、invokeAwareMethods里面可以看到,判断当前bean是否是实现了aware,根据实现的不同,setBeanFactory,这时候就开始调用setBeanFactory。

十一、super调用父类的setBeanFactory,到了这一步,就到了我们 上篇文章说的setBeanFactory类这里。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值