要从开启代理的@EnableAspectJAutoProxy注解说起,这个注解import了ImportBeanDefinitionRegistrar类,而这个类又向容器中注册了
AnnotationAwareAspectJAutoProxyCreator的bean定义
而AnnotationAwareAspectJAutoProxyCreator是定义了postProcessAfterInitialization ,
所以在getBean的过程中会调用
resolveBeforeInstantiation来调用所有对应的postProcessBeforeInstantiation
而上文的AnnotationAwareAspectJAutoProxyCreator实现了该接口,会调用其postProcessBeforeInstantiation,
而这个方法中会触发遍历当前容器中所有的对象,并筛选出是Advice和Aspectj的类
并将筛选出来的类遍历所有的方法,筛选出切面注解的方法包装成增强器类并设置进集合中存入缓存
接着在后面的postProcessAfterInitialization中,会调用wrapIfNecessary
判断并生成代理类,首先会获取所有的增强器集合,通过上一步在缓存中获取,然后筛选出可用的增强器集合,这里主要是通过方法匹配器去匹配注解上的匹配表达式
是否匹配来判断是否需要对应的增强器,然后 把获取的可用的增强器集合设置设置进代理工厂生成代理对象.
registerAspectJAnnotationAutoProxyCreatorIfNecessary 注册或者升级InternalAutoProxyCreator
---->registerOrEscalateApcAsRequired
------>registerBeanDefinition
useClassProxyingIfNecessary 修改bean定义中对应的属性
------------>forceAutoProxyCreatorToUseClassProxying
------------>forceAutoProxyCreatorToExposeProxy
registerComponentIfNecessary
AbstractAutoProxyCreator#postProcessAfterInitialization
1---->warpIfNecessary
1.1---->getAdvicesAndAdvisorsForBean获取增强方法或增强器
---->findEligibleAdvisors
---->findCandidateAdvisors 获取所有的增强器
---->buildAspectJAdvisors 遍历所有的beanName提取出是AspectJ类的bean,并解析bean中的增强方法包装成Advisor返回并缓存
---->getAdvisors 解析AspectJ并将其中的增强方法包装成增强器
---->getAdvisor 解析注解内容包装成增强器
---->getPointcut 切点表达式获取,如@Before("xxxxx"),获取方法上的注解,创建AspectJExpressionPointcut对象将注解设置进其属性并返回
---->findAspectJAnnotationOnMethod 获取方法上的注解,根据设置的指定注解类,循环这些注解类匹配方法上的注解并返回
---->findAnnotation 匹配特定注解类和方法上对应的注解,匹配则返回对应AspectJAnnotation
---->InstantiationModelAwarePointcutAdvisorImpl 根据获取的切点表达式包装成对应增强器,简单的属性直接赋值
---->
---->findAdvisorsThatCanApply 从所有的增强器中获取适用的增强器
1.2---->createProxy 根据获取增强器进行代理