spring AOP 原理

图1

一、spring注册 AnnotationAwareAspectJAutoProxyCreator

  1. 通过@EnableAspectJAutoProxy可以看到先把AspectJAutoProxyRegistrar通过@Import注册到spring。

  2. AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,所以就有了将某个bean引入spring 的能力。再接下来的运行中会把 AnnotationAwareAspectJAutoProxyCreator.class 以beanName为org.springframework.aop.config.internalAutoProxyCreator注册到spring中。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p31z2bQz-1674821484013)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127191959587.png)]

二、 AnnotationAwareAspectJAutoProxyCreator分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txKR033p-1674821484013)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127193327946.png)]

  1. 通过查看 AnnotationAwareAspectJAutoProxyCreator的类继承图可以清楚的看到实现了 BeanPostProcessor接口,所以AnnotationAwareAspectJAutoProxyCreator注册到spring以后成为了spring 的 BeanPostProcessor后置处理器。
  2. BeanPostProcessor 接口 的postProcessBeforeInstantiation()、postProcessAfterInitialization(),在 AbstractAutoProxyCreator中已经得到了实现。(后面拿代理对象的时候就是在AbstractAutoProxyCreator.postProcessAfterInitialization())中去处理的。

三、获取代理对象

  1. 由图1可知,在bean init 初始化的时候会前后调用 后置处理器的postProcessBeforeInstantiation()、postProcessAfterInitialization()。代码如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0pBLoOw-1674821484014)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127195251942.png)]

  2. 当前Bean在获取代理对象主要是在 postProcessAfterInitialization() 方法中去获取的。Bean在获取代理对象时会判断当前的bean是否实现了接口

    • 如果实现了接口,那么就使用jdk 的动态代理来生成bean 的代理对象
    • 如果没有实现接口,那么就使用Cglib 来生成当前bean 的代理对象(因为jdk 动态代理的对象必须是实现了接口的bean)
  3. 即使没有做切片的Bean 也会调用这个postProcessAfterInitialization() ,但是会验证当前Bean有没有切片,没有切片的话就不会被代理了。

四、代理链(以JDK动态代理对象为例)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8m0Up0b-1674821484014)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/5.aop实现原理下--代理过程.png)]

  1. 用jdk 的动态代理代理Bean,那么被代理的bean在执行任何方法的时候就会进入到 JdkDynamicAopProxyinvoke()方法。

  2. invoke()方法的调用链如上。这个调用链实际上是使用 责任链模式来做的,调用是环环相扣的,上图为了简化有失准确。具体的逻辑见下图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值