配置文件
直接看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(使用前将#替换为@)