AnnotationAwareAspectJAutoProxyCreator后置处理器的BeanDefinition定义信息导入和其对象实例创建过程

步骤1
我们从配置类上的@EnableAspectJAutoProxy 注解入手,进入发现这个注解上又有一个@Import(AspectJAutoProxyRegistrar.class)注解,

了解Spring注解式开发的都知道,@Import是可以导入组件到IOC容器中的,而其中的AspectJAutoProxyRegistrar是实现了ImportBeanDefinitionRegistrar接口

可以实现批量导入组件的自定义信息BeanDefinition到IOC容器中,那么我们就研究一下这个类。


步骤2

进入AspectJAutoProxyRegistrar类中,发现其中重写了registerBeanDefinitions()方法,在这个方法上打一个断点,以debug启动测试方法


步骤3

debug跟进,来到AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

F5一直跟进,来到AopConfigUtil.registerOrEscalateApcAsRequired()方法

会发现,首先判断当前容器中是否包含org.springframework.aop.config.internalAutoProxyCreator组件的定义,

debug发现当前容器中没有,if 没有进去,接着往下走。

cls为org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator类型,通过RootBeanDefinition对其进行包装,

通过registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);将其加入到IOC容器中,并命名为org.springframework.aop.config.internalAutoProxyCreator

到这里容器中就有internalAutoProxyCreator类型的组件了,其实这个组件实际类型为AnnotationAwareAspectJAutoProxyCreator

那么向容器中加入AnnotationAwareAspectJAutoProxyCreator有啥用呢?我们就来研究一下AnnotationAwareAspectJAutoProxyCreator


步骤4

AnnotationAwareAspectJAutoProxyCreator的类结构:

进入AnnotationAwareAspectJAutoProxyCreator,通过查看其父类AbstractAutoProxyCreator发现AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor及BeanFactoryAware

查看SmartInstantiationAwareBeanPostProcessor发现他是BeanPostProcessor的子接口,

BeanPostProcessor是后置处理器的总接口,那么也就说明AbstractAutoProxyCreator是后置处理器,而它又实现BeanFactoryAware

所以在初始化AbstractAutoProxyCreator的时候,会通过setBeanFactory()向其注入BeanFactory,

接下来就看看AbstractAutoProxyCreator作为后置处理器和BeanFactory都干了些啥


步骤5

首先我们需要加一些断点,辅助我们调试,我们需要在org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.setBeanFactory(BeanFactory)上打一个断点

查看作为BeanFactoryAware啥时候调用了setBeanFactory()方法。然后在org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(Class<?>, String)

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(Object, String)上个加一个断点,查看作为后置处理器啥时候调用了这两个方法

之后在org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.setBeanFactory(BeanFactory)上加一个断点,因为他重写了父类的setBeanFactory()方法。最后在

org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.initBeanFactory(ConfigurableListableBeanFactory)上加一个断点,因为他重写了父类的initBeanFactory()方法


步骤6

从头看起,测试方法中,开始先new了一个AnnotationConfigApplicationContext传入一个配置类,在其构造方法上加一个断点,跟进查看

看到先注册配置类然后调用了refresh()方法,F5进入refresh()方法,看到调用了registerBeanPostProcessors(beanFactory)方法

进入registerBeanPostProcessors(beanFactory)方法,一直来到PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this) 中,


看到先通过beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);获得容器中已经定义了的所有BeanPostProcessor类型的组件名,


并向容器中加了一下额外的后置处理器。


步骤7

接着跟进,后面通过循环将后置处理器进行分组,因为后置处理器可以通过实现PriorityOrdered接口,定制优先级。


接着下来看到,优先注册实现PriorityOrdered接口的后置处理器,


在来注册实现Ordered接口的后置处理器,


最后注册没有实现优先级接口的后置处理器

走到实现Ordered接口的后置处理器的循环中,发现org.springframework.aop.config.internalAutoProxyCreator组件也在其中

上面我们已经提到过,其实internalAutoProxyCreator就是AnnotationAwareAspectJAutoProxyCreator,


而AnnotationAwareAspectJAutoProxyCreator也是一个后置处理器,那么AnnotationAwareAspectJAutoProxyCreator实现了Ordered接口吗 ?


通过查看源码发现,他的父类AbstractAutoProxyCreator继承了ProxyProcessorSupport,而ProxyProcessorSupport实现了Ordered接口,


那么就看看AnnotationAwareAspectJAutoProxyCreator是如何被创建出来的。


步骤8

在for循环中调用了 beanFactory.getBean(ppName, BeanPostProcessor.class)方法,F5跟进


来到AbstractBeanFactory.doGetBean(String, Class, Object[], boolean)方法,


一路来到getSingleton()缓存方法,获得bean,但由于容器第一次创建,根本就获取不到,


就来到DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory<?>)方法,就通过singletonFactory.getObject();


创建bean,实际就是创建后置处理器然后保存到容器中


那么容器是如何创建internalAutoProxyCreator【AnnotationAwareAspectJAutoProxyCreator】的呢 ?


跟进singletonFactory.getObject();


一直来到AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[])方法

进入doCreateBean()方法中,对internalAutoProxyCreator进行创建

之后就是对后置处理器对象进行属性赋值

后有一个initializeBean(beanName, exposedObject, mbd)就是初始化处理器对象,进入初始化方法

有一个invokeAwareMethods(beanName, bean)方法,进到其中发现,在判断bean是否是XXXAware接口的实现,


而通过前面分析,我们的internalAutoProxyCreator【AnnotationAwareAspectJAutoProxyCreator】实现了BeanFactoryAware接口,


所以这里就是在为其赋值,先调用其父类的方法AbstractAdvisorAutoProxyCreator.setBeanFactory(BeanFactory)

调用父类的setBeanFactory()后,又调用了initBeanFactory((ConfigurableListableBeanFactory) beanFactory)方法,初始化beanFactory,


最终调到AnnotationAwareAspectJAutoProxyCreator.initBeanFactory(ConfigurableListableBeanFactory)中的initBeanFactory()方法,


在其中创建了反射的通知工厂和构建通知适配器。

invokeAwareMethods(beanName, bean)方法执行完毕


后会调用applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)方法,这是在调用所有后置处理器的postProcessBeforeInitialization()方法


之后又调用invokeInitMethods(beanName, wrappedBean, mbd)方法,这是在调用所有的bean的初始化方法,


之后有调用applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)方法,这是在调用所有后置处理器的postProcessAfterInitialization()方法。


至此,后处理器就创建完成了,PostProcessorRegistrationDelegate#registerBeanPostProcessors()方法内,


调用beanFactory.addBeanPostProcessor(postProcessor),将BeanPostProcessor添加到beanFactory当中


步骤9

以上是创建和注册AnnotationAwareAspectJAutoProxyCreator的过程,当AnnotationAwareAspectJAutoProxyCreator被创建出来,


后来的bean的创建都需要通过这个后置处理器,下面我们就看一下,AnnotationAwareAspectJAutoProxyCreator作为后置处理器都做了些啥

posted @ 2025-03-25 18:39  jock_javaEE  阅读(21)  评论(0)    收藏  举报