小言_互联网的博客

spring AOP 原理

238人阅读  评论(0)

一、spring注册 AnnotationAwareAspectJAutoProxyCreator

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

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

二、 AnnotationAwareAspectJAutoProxyCreator分析

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

三、获取代理对象

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

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

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

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

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

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


转载:https://blog.csdn.net/langwuzhe/article/details/128772635
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场