讲一讲AOP的实现

spring aop最主要的是围绕解析切面类,创建代理对象,调用代理对象方法这三个环节展开,

而解析切面类,创建代理对象得从@EnableAspectjAutoProxy注解说起

这个注解里面@Import了AspectJAutoProxyRegister

在解析配置类的后置处理器中就会对Import注解进行解析,

因为这个类实现了ImportBeanDefinitionRegister接口

所以解析这个类主要就是调用RegisterBeanDefinitions,  向BeanDefinitonMap中注册了

AnnotationAwareAspectJAutoProxyCreator,

而这个Creator是个后置处理器,会在bean实例化前,初始化后两个关键节点上完成解析切面类,创建Proxy代理对象的操作,

解析切面类就是在bean的实例化前循环遍历所有的beanDefinition定义,找出有Aspectj注解的beanDefinition,

把对应的beanName放进一个list中专门记录切面类的bean名称,

遍历对应bean的所有方法,对每一个pointcut注解生成对应的advisor,add进list中

再把key为切面类的beanName,value为对应的上面解析完的该类中的advisor集合put进map中

最后再循环遍历所有的切面类的名称,把map中对应的advisor集合全部add进一个list中

创建Proxy代理对象,在初始化bean对象之后调用后置处理器的对应方法,也就是上文的Creator的对应方法,

循环遍历所有的advisor,匹配当前类的方法是否和advisor中的pointcut的表达式,如果匹配,则将匹配的advisor放进新的list中,当循环完所有advisor,如果新的list中不为空,则代表有advisor匹配,把存放匹配的advisor的list设置进对应的代理工厂,并创建代理对象

最后是调用,取出代理对象对应的advisors,转化成intersector数组责任链

通过遍历责任链数组,递归调用完成advisor中的advice的调用

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值