讲一讲aop

 

要从开启代理的@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 根据获取增强器进行代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值