Spring注解驱动开发-part6基于注解的AOP初始化

本文详细探讨了AOP(面向切面编程)在Spring框架中的应用原理,特别是@EnableAspectJAutoProxy注解的作用机制,包括如何通过该注解开启AspectJ自动代理,以及AnnotationAwareAspectJAutoProxyCreator类在Bean创建过程中的角色。文章还剖析了AbstractAutoProxyCreator类及其子类在Bean后置处理中的具体实现。

如何研究AOP原理?

  1. 看容器中注册了什么组件?
  2. 这个组件什么时候工作?
  3. 这个组件的功能是什么?

@EnableAspectJAutoProxy注解初步

  • 功能:开启基于AspectJ的自动代理

该注解接口导入了AspectJAutoProxyRegistrar.class
在这里插入图片描述
AspectJAutoProxyRegistrar重载了imoportBeanDefnitionRegistrar中的注册bean方法
在这里插入图片描述

AnnotationAwareAspectJAutoProxyCreator

在这里插入图片描述尝试升级已有的Bean或注册新的Bean,类型为:AnnotationAwareAspectJAutoProxyCreator
该Bean 的名称为:internalAutoProxyCreator

在这里插入图片描述internalAutoProxyCreator
在这里插入图片描述

public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator {

在这里插入图片描述

public class AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator {

在这里插入图片描述

public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator {

在这里插入图片描述
注意这里的后置处理接口,以及BeanFactoryAware会设置BeanFactory

public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {

在这里插入图片描述
AbstractAutoProxyCreator有:
setBeanFactory,
postProcessAfterInitialization,
postProcessBeforeInitialization。

AbstractAdvisorAutoProxyCreator有:
重写setBeanFactory,其中调用initBeanFactory

AspectJAwareAdvisorAutoProxyCreator有:

AnnotationAwareAspectJAutoProxyCreator有:
重写initBeanFactory

断点设置:
在这里插入图片描述

Debug调试到断点:
在这里插入图片描述在这里插入图片描述流程:
this();//无参构造容器
register(componentClasses; //注册组件类
refresh(); //刷新容器,容器中的所有Bean创建出来
在这里插入图片描述

注册所有后置处理器,用于拦截bean 的创建

在这里插入图片描述获取ioc容器中已经定义了的需要创建对象的所有BeanPostProcessor
在这里插入图片描述添加其他BeanPostProcessor
在这里插入图片描述优先注册实现了PriorityOrdered接口的BeanPostProcessor在这里插入图片描述
然后注册实现了Ordered接口的BeanPostProcessor
在这里插入图片描述最后注册常规的BeanPostProcessor
在这里插入图片描述

创建并获得单实例

第一次get的时候必定需要create,在参数singletonFactory处,使用了匿名类JDK8的最新写法,直接用lambda表达式表示实现了对应接口的匿名类。

在这里插入图片描述创建好之后,在doCreateBean中填充(Populate)Bean在这里插入图片描述初始化Bean
在这里插入图片描述是否实现了一些Aware接口?
如果是则调用相关方法,注意这里用的if没有else判断!
这里就是Aware接口的一些赋值处理。
在这里插入图片描述接下来在初始化方法invokeInitMethods的前后分别调用:
applyBeanPostProcessorBeforeInitialization,applyBeanPostProcessorAfterInitialization

在这里插入图片描述applyBeanPostProcessorBeforeInitialization 干了啥?
调用BeanPostProcessor接口对应功能!
在这里插入图片描述setBeanFactory,完成AbstractAdvisorAutoProxyCreator的最终注册
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值