当前位置:主页 > java教程 > Springboot AbstractAdvisorAutoProxyCreator

Springboot源码AbstractAdvisorAutoProxyCreator解析

发布:2019-12-08 12:45:55 113


为找教程的网友们整理了Springboot源码相关的编程文章,网友怀紫丝根据主题投稿了本篇教程内容,涉及到springboot、源码、abstractadvisorautoproxycreator、Springboot AbstractAdvisorAutoProxyCreator相关内容,已被617网友关注,内容中涉及的知识点可以在下方直接下载获取。

Springboot AbstractAdvisorAutoProxyCreator

摘要:

Spring的代理在上层中主要分为ProxyCreatorSupportProxyProcessorSupport,前者是基于代理工厂,后者是基于后置处理器,也可以认为后置就是自动代理器。当spring容器中需要进行aop进行织入的bean较多时,简单采用ProxyFacotryBean无疑会增加很多工作量(因为每个Bean!都得手动写一个)。所以自动代理就发挥它的作用了。

Springboot源码 AbstractAdvisorAutoProxyCreator解析

Spring中自动创建代理器分类

在内部,Spring使用BeanPostProcessor让自动生成代理。基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则在容器实例化Bean时为匹配的Bean生成代理实例。代理创建器可以分为三类:

  • 基于Bean配置名规则的自动代理生成器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator
  • 基于Advisor匹配机制的自动代理创建器它会对容器中的所有Advisor进行扫描,自动将这些切面应用到匹配的Bean中,实现类是DefaultAdvisorAutoProxyCreator(它也支持前缀匹配)
  • 基于Bean中AspectJ注解的自动代理生成器:为包含AspectJ注解的切入的Bean自动创建代理实例,实现类是AnnotationAwareAspectJAutoProxyCreator,它是我们的@EnableAspectJAutoProxy导入的,这也是我们当下使用最为广泛的方式~

BeanNameAutoProxyCreator

  package com.github.dqqzj.springboot.aop;  
  import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
  import org.springframework.stereotype.Component;  
  import javax.annotation.PostConstruct;  
  /**
   * @author qinzhongjian
   * @date created in 2019-08-25 09:43
   * @description: TODO
   * @since JDK 1.8.0_212-b10
   */
  @Component
  public class MyBeanNameAutoProxyCreator extends BeanNameAutoProxyCreator {
    @PostConstruct
    public void init() {
      super.setBeanNames("aopService", "abstractAutoProxyCreatorService");
      super.setInterceptorNames("myMethodBeforeAdvice");
    }  
  }

Springboot源码 AbstractAdvisorAutoProxyCreator解析

如果你想用自己注册的@Bean代替@EnableAspectJAutoProxy默认给你注册的自动创建器AnnotationAwareAspectJAutoProxyCreator,那么你可以注册一个Bean名称如下的Bean即可:

  // 手动注册一个自动代理创建器,且名字务必叫AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME
  @Bean(AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME) 
  public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
    ...
  }

AbstractAutoProxyCreator

  public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
      implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
      ...
  }

AbstractAutoProxyCreator是对自动代理创建器的一个抽象实现。最重要的是,它实现了SmartInstantiationAwareBeanPostProcessor接口,因此会介入到Spring IoC容器Bean实例化的过程,在AbstractAutowireCapableBeanFactory中有这样一段代码

  try {
        // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
        Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
        if (bean != null) {
          return bean;
        }
      }

但是一般都不会生效的,因为这个resolveBeforeInstantiation只是针对有自定义的targetsource,因为自定义的targetsource不是spring的bean那么肯定不需要进行后续的一系列的实例化 初始化。所以可以在resolveBeforeInstantiation直接进行proxy。简单的说吧 ,这个代码可以忽略不计,开发者一般用不到。

如何让resolveBeforeInstantiation直接返回bean?

  package com.github.dqqzj.springboot.aop;
  
  import org.springframework.beans.BeansException;
  import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
  
  /**
   * @author qinzhongjian
   * @date created in 2019-08-25 11:35
   * @description: TODO
   * @since JDK 1.8.0_212-b10
   */
  public class AopServiceInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
      if (beanClass.isInstance(AopService.class)) {
        return new AopService();
      }
      return null;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      return bean;
    }
  }

Springboot源码 AbstractAdvisorAutoProxyCreator解析

这个是spring第一次后置处理器的使用,如果这样直接就返回了,就相当于脱离了IOC的生命周期了一样,依赖注入,属性填充等这些都没有进行处理,所以使用的时候一定要注意,最好别使用这个功能。

在初始化bean的过程中后续还有2个特别重要的后置处理过程,对于循环依赖甚至异步注解事物注解等都有或多或少的影响,后续会继续分析它们。

小结:

SpringAOP应尽量避免自己创建AutoProxyCreator,内部机制及其复杂难免会由于没有想到的问题而出现其他不常见的问题,上面分享的内容很少,原因是我觉得熟悉这个架构设计师最关键的,各种子类的虽然实现大不相同,但是你想全部都记在脑海或者很熟悉那是不太现实的,只有熟悉他的设计才能遇见问题轻易的就能翻源码解决。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。


参考资料

相关文章

  • SpringBoot访问静态资源的配置及顺序说明

    SpringBoot访问静态资源的配置及顺序说明

    发布:2022-07-06

    给网友们整理关于SpringBoot的教程,这篇文章主要介绍了SpringBoot访问静态资源的配置及顺序说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • SpringBoot 2 快速整合 Filter过程详解

    发布:2020-06-13

    这篇文章主要介绍了SpringBoot 2 快速整合 Filter过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • 解读springboot配置mybatis的sql执行超时时间(mysql)

    发布:2023-03-08

    这篇文章主要介绍了解读springboot配置mybatis的sql执行超时时间(mysql),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • 详解如何将springboot项目导出成war包

    发布:2022-04-05

    这篇文章主要介绍了详解如何将springboot项目导出成war包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • 详解SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)

    发布:2022-10-17

    给大家整理了关于SpringBoot的教程,这篇文章主要介绍了SpringBoot的三种缓存技术,帮助大家更好的理解和学习springboot框架,感兴趣的朋友可以了解下


  • Java源码TypeVariable实例分析

    发布:2021-05-11

    这篇文章主要介绍了Java源码解析之TypeVariable详解,具有一定参考价值,需要的朋友可以了解下。


  • SpringBoot动态定时任务实现完整版

    发布:2023-03-24

    最近有幸要开发个动态定时任务,这里简单再梳理一下,下面这篇文章主要给大家介绍了关于SpringBoot动态定时任务实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下


  • springBoot集成flowable的流程解析

    发布:2023-04-04

    这篇文章主要介绍了springBoot集成flowable的流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


网友讨论