Spring源码解析7-(xml)Spring的AOP

2023-05-16

配置文件

直接看refresh()中的obtainFreshBeanFactory(),初始化容器,加载配置文件成beanDefinition

直接到DefaultBeanDefinitionDocumentReader的parseBeanDefinitions()

解析标签

直接到ConfigBeanDefinitionParser的parse()方法

注册自动代理模式的创建器AspectjAwareAdvisorAutoProxyCreator

继承关系,所以注解是xml配置的拓展

xml配置文件用AspectjAwareAdvisorAutoProxyCreator,注解用AnnotationAwareAdvisorJAutoProxyCreator

然后开始解析配置文件,将、 、、 、 aop:after-throwing>分别解析成一下对象AspectJAroundAdvice、AspectJMethodBeforeAdvice、AspectJAfterAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice,每个对象的生成,构造方法需要method对象,beanFactory对象,以及AspectJExpressionPointcut表达式对象

将解析出的对象注入到ioc容器中

refresh()中的obtainFreshBeanFactory(),初始化容器,加载配置文件成beanDefinition注入ioc容器已经完成

然后到refresh()的registerBeanPostProcessors(beanFactory)注册bean处理器,因为AspectjAwareAdvisorAutoProxyCreator是BeanPostProcessor

refresh()中的finishBeanFactoryInitialization(beanFactory),开始实例化

解析出了9个beanDefinition,在ioc容器

refresh()中的finishBeanFactoryInitialization(beanFactory),开始实例化

直接到createBean()的resolveBeforeInstantiation()方法,给当前BPP一个机会去生成一个动态代理对象直接返回

只有在实现aop的时候并且实现了InstantiationAwareBeanPostProcessor接口

applyBeanPostProcessorsBeforeInstantiation(),

调用AbstractAutoProxyCreator.postProcessBeforeInstantiation()方法

AspectJAwareAdvisorAutoProxyCreator.shouldSkip()

找到当前容器缓存的aspect,并创建Advisor对象

AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()

findAdvisorBeans(),调用BeanFactoryAdvisorRetrievalHelper来寻找是否有Advisor的bean定义,如果存在就放入缓存,并进行创建,然后返回

之前的创建对象,实例化都是调用无参构造方法,然后通过set方法填充属性

现在的advisor对象创建,都是有参构造方法,执行前需要把构造器中需要的对象提前创建好

进入的是createBeanInstance()中的autowireConstructor()方法

autowireConstructor()的resolveConstructorArguments(),解析到的参数个数

执行resolveValueIfNecessary(),解析出valueHolder实例的构造函数参数值所封装的对象,目前Advisor的构造函数的参数是Advice对象

当前Advice对象是RootBeanDefinition

进入resolveInnerBean(),解析内部bean对象

createBean(),创建Advice对象,继续进入autowireConstructor(),resolveConstructorArguments()解析参数,执行resolveValueIfNecessary(),解析出valueHolder实例的构造函数参数值所封装的对象,目前Advice的构造函数的参数是Method,AspectJExpressionPointcut,AspectInstanceFactory这三个内部对象,进入resolveInnerBean(),解析内部bean对象,又开始createBean() ,创建Method,AspectJExpressionPointcut,AspectInstanceFactory这三个内部对象,这三个对象用无参构造进行创建。

总结:

1、创建AspectJPointcutAdvisor#0到#4,先使用其带参的构造方法进行对象的创建,带参数的构造方法,必须要把参数对象准备好,因此要准备创建内置包含的对象AspectJAroundAdvice

2、创建AspectJAroundAdvice,使用带参的构造方法,也需提前准备好具体的参数对象,包含三个参数:

   1、MethodLocatingFactoryBean

   2、AspectJExpressionPointcut

   3、SimpleBeanFactoryAwareAspectInstanceFactory

3、分别创建上述的三个对象,上述三个对象的创建过程都是调用无参的构造方法,直接反射生成即可。

最后创建AspectJPointcutAdvisor#0到AspectJPointcutAdvisor#4

对象创建完后,仅仅只是findCandidateAdvisors() 这部分完成

AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()

然后在寻找注解@Aspect标注的bean,并且找到该bean中使用@Before,@After等标注的方法, 将这些方法封装为一个个Advisor,加入list

buildAspectJAdvisors(),寻找Aspect注解的面向对象,然后解析他的方法,通过注解来生成对应的通知器Advisor。

然后生成切面对象logUtil后,设置成跳过动态代理,切面对象不需要动态代理

跳过动态代理返回true,直接跳过动态代理步骤

跳过动态代理后,会直接创建logUtil本身对象

createBean()的resolveBeforeInstantiation()完成,直接doCreateBean()

填充完属性,进行initializeBean初始化对象

而创建myCalculator被代理对象时,会进行代理。

将BeanPostProcessors应用到给定的现有Bean实例,调用它们的postProcessAfterInitialization方法

调用AnnotationAwareAspectJAutoProxyCreator的postProcessAfterInitialization()方法,AnnotationAwareAspectJAutoProxyCreator没有这个方法,调用父类AbstractAutoProxyCreator的postProcessAfterInitialization()

postProcessAfterInitialization(),真正创建aop代理的地方,在实例化之后,初始化之后就行处理

wrapIfNecessary(),先判断是否已经处理过,是否需要跳过,跳过的话直接就放进advisedBeans里,表示不进行代理,如果这个bean不需要跳过了,获取通知拦截器,然后开始进行代理

getAdvicesAndAdvisorsForBean(),获取当前bean的Advices和Advisors

findEligibleAdvisors(),找到所有符合条件的通知对于自动代理的类

检测实例化之后的bean是否需要通知器,其实就是检测方法或者类上是否需要事务注解

findAdvisorsThatCanApply(),从候选的通知器中找到合适正在创建的实例对象的通知器

canApply(),匹配当前增强器是否适合当前myCalculator对象

从Advisor中获取Pointcut的实现类 这里是AspectJExpressionPointcut,匹配表达式是否适合当前对象

findEligibleAdvisors(),对于自动代理的类完成找到所有符合条件的通知

getAdvicesAndAdvisorsForBean()已经完成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring源码解析7-(xml)Spring的AOP 的相关文章

随机推荐