最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot源碼 AbstractAdvisorAutoProxyCreator解析

 更新時間:2019年08月27日 08:50:59   作者:TheGir1  
這篇文章主要介紹了Springboot源碼 AbstractAdvisorAutoProxyCreator解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

摘要:

Spring的代理在上層中主要分為ProxyCreatorSupportProxyProcessorSupport,前者是基于代理工廠,后者是基于后置處理器,也可以認為后置就是自動代理器。當spring容器中需要進行aop進行織入的bean較多時,簡單采用ProxyFacotryBean無疑會增加很多工作量(因為每個Bean!都得手動寫一個)。所以自動代理就發(fā)揮它的作用了。

Spring中自動創(chuàng)建代理器分類

在內部,Spring使用BeanPostProcessor讓自動生成代理?;?code>BeanPostProcessor的自動代理創(chuàng)建器的實現類,將根據一些規(guī)則在容器實例化Bean時為匹配的Bean生成代理實例。代理創(chuàng)建器可以分為三類:

  • 基于Bean配置名規(guī)則的自動代理生成器:允許為一組特定配置名的Bean自動創(chuàng)建代理實例的代理創(chuàng)建器,實現類為BeanNameAutoProxyCreator
  • 基于Advisor匹配機制的自動代理創(chuàng)建器它會對容器中的所有Advisor進行掃描,自動將這些切面應用到匹配的Bean中,實現類是DefaultAdvisorAutoProxyCreator(它也支持前綴匹配)
  • 基于Bean中AspectJ注解的自動代理生成器:為包含AspectJ注解的切入的Bean自動創(chuàng)建代理實例,實現類是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");
    }  
  }

如果你想用自己注冊的@Bean代替@EnableAspectJAutoProxy默認給你注冊的自動創(chuàng)建器AnnotationAwareAspectJAutoProxyCreator,那么你可以注冊一個Bean名稱如下的Bean即可:

  // 手動注冊一個自動代理創(chuàng)建器,且名字務必叫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是對自動代理創(chuàng)建器的一個抽象實現。最重要的是,它實現了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那么肯定不需要進行后續(xù)的一系列的實例化 初始化。所以可以在resolveBeforeInstantiation直接進行proxy。簡單的說吧 ,這個代碼可以忽略不計,開發(fā)者一般用不到。

如何讓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;
    }
  }

這個是spring第一次后置處理器的使用,如果這樣直接就返回了,就相當于脫離了IOC的生命周期了一樣,依賴注入,屬性填充等這些都沒有進行處理,所以使用的時候一定要注意,最好別使用這個功能。

在初始化bean的過程中后續(xù)還有2個特別重要的后置處理過程,對于循環(huán)依賴甚至異步注解事物注解等都有或多或少的影響,后續(xù)會繼續(xù)分析它們。

小結:

SpringAOP應盡量避免自己創(chuàng)建AutoProxyCreator,內部機制及其復雜難免會由于沒有想到的問題而出現其他不常見的問題,上面分享的內容很少,原因是我覺得熟悉這個架構設計師最關鍵的,各種子類的雖然實現大不相同,但是你想全部都記在腦?;蛘吆苁煜つ鞘遣惶F實的,只有熟悉他的設計才能遇見問題輕易的就能翻源碼解決。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 為什么不要使用 async void的原因分析

    為什么不要使用 async void的原因分析

    這篇文章主要介紹了為什么不要使用 async void的原因分析及解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Java中的值傳遞和引用傳遞區(qū)別解析

    Java中的值傳遞和引用傳遞區(qū)別解析

    這篇文章主要介紹了Java中的值傳遞和引用傳遞區(qū)別解析,引用類型的變量保存引用值,“引用值”指向內存空間的地址,代表了某個對象的引用,而不是對象本身,對象本身存放在該引用值所表示的地址的位置,包含:數組、類、接口,需要的朋友可以參考下
    2023-11-11
  • Java中的stream流的概念解析及實際運用總結

    Java中的stream流的概念解析及實際運用總結

    流是指傳輸時的數據,Java為流準備了很多內置類,尤其是IO輸入輸出流非常常用,這里我們來看一下Java中的stream流的概念解析及實際運用總結
    2016-06-06
  • Java中的可變參數常見用法實例總結

    Java中的可變參數常見用法實例總結

    這篇文章主要介紹了Java中的可變參數常見用法,結合實例形式總結分析了java可變參數的常見功能、使用方法及相關操作注意事項,需要的朋友可以參考下
    2019-10-10
  • EasyExcel實現導入+各種數據校驗功能

    EasyExcel實現導入+各種數據校驗功能

    這篇文章主要介紹了EasyExcel實現導入+各種數據校驗,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • JSP服務器端和前端出現亂碼問題解決方案

    JSP服務器端和前端出現亂碼問題解決方案

    這篇文章主要介紹了JSP服務器端和前端出現亂碼問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • java與c#的語法區(qū)別詳細介紹

    java與c#的語法區(qū)別詳細介紹

    由C#轉入Java一段時間了,總結下個人認為的Java同C#語法之間的不同之處,有不同意見之處還望各位海涵,剛學Java時覺得語法同C#大致是相同的(應該說C#同Java大致相同
    2012-11-11
  • Mybatis源碼解析之事務管理

    Mybatis源碼解析之事務管理

    大家好,本篇文章主要講的是Mybatis源碼解析之事務管理,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 詳解Spring Cloud 跨服務數據聚合框架

    詳解Spring Cloud 跨服務數據聚合框架

    這篇文章主要介紹了詳解Spring Cloud 跨服務數據聚合框架,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗

    IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗

    IntelliJ?IDEA?2022.2為遠程開發(fā)功能帶來了多項質量改進,使其更美觀、更穩(wěn)定,新版本還具有多項值得注意的升級和改進,下面跟隨小編一起看看IDEA?2022.2新版本吧
    2022-08-08

最新評論

开江县| 麻江县| 徐闻县| 德保县| 昌黎县| 长垣县| 渝北区| 满洲里市| 喀喇| 长乐市| 龙陵县| 普陀区| 邵武市| 陆河县| 防城港市| 乐至县| 吉木乃县| 石门县| 定远县| 九台市| 香港| 深圳市| 遂溪县| 上犹县| 廉江市| 吉安市| 襄汾县| 汉中市| 永兴县| 阿巴嘎旗| 乐都县| 汝南县| 东城区| 会东县| 呼玛县| 内丘县| 广州市| 桃园市| 合肥市| 西宁市| 扎赉特旗|