亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解關于spring bean名稱命名的那些事

 更新時間:2021年07月09日 10:59:39   作者:linyb極客之路  
每個bean都有一個或者多個標識符,這些標識符在容器中必須是唯一的,這篇文章主要給大家介紹了關于spring bean名稱命名的那些事,需要的朋友可以參考下

前言

用了多年spring,一直想當然把spring默認的beanName當成是類名的首字母小寫,比如HelloService其beanName為helloService。直到有天對接了供方廠商的接口,他有個類形如ABService,于是用

getBean(“aBService”)

的方式獲取bean,結果取到是null,一開始以為是ABservice沒注入,后面采用

getBean(ABService.class)

能成功獲取到bean,說明ABService是有注入到IOC容器中,但是為啥用aBService獲取不到bean?于是就用如下代碼段,打印出相應ABService對應的beanName

applicationContext.getBeansOfType(ABService.class).forEach((beanName,bean)->{
            System.out.println(beanName + ":" + bean);
        });

打印出來的結果,如下

ABService:com.github.lybgeek.ABService@245b6b85

beanName竟然是ABService,這就和之前的想當然有出入。于是只好查看源碼

02源碼查看

源碼查看有2種方式,本文的示例是springboot項目

01從main方法直接調試斷點

從圖可以看出如果是以掃描注解注入形式,其beanName的生成規(guī)則是由

org.springframework.context.annotation.AnnotationBeanNameGenerator#generateBeanName

決定。

ps: 這種直接從main啟動類調試起,比較適用于時間比較多,或者排查毫無頭緒

02帶著問題查看,靠猜加驗證的方式

利用idea的find Usage查找引用,比如ABService的注解@service,我們可以直接查看哪個引用到@Service,再猜測下beanName的生成規(guī)則

通過猜,我們基本上就可以定位出比較符合我們需求的方法

03源碼驗證

從上面的分析,我們可以知道如果是掃描bean注解注入的方式,其生成beanName規(guī)則,是在

org.springframework.context.annotation.AnnotationBeanNameGenerator

其生成規(guī)則代碼如下

@Override
  public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
    if (definition instanceof AnnotatedBeanDefinition) {
      String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
      if (StringUtils.hasText(beanName)) {
        // Explicit bean name found.
        return beanName;
      }
    }
    // Fallback: generate a unique default bean name.
    return buildDefaultBeanName(definition, registry);
  }

從代碼段,我們可以看出,注解上有取名,比如@Service(“abService”),則beanName為abService,如果沒有取名,則看

protected String buildDefaultBeanName(BeanDefinition definition) {
    String beanClassName = definition.getBeanClassName();
    Assert.state(beanClassName != null, "No bean class name set");
    String shortClassName = ClassUtils.getShortName(beanClassName);
    return Introspector.decapitalize(shortClassName);
  }

public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

其實從代碼我們就很容易看出答案了,如果類名前兩個或以上個字母都是大寫,則beanName和類名就一樣了,不會進行首字母小寫轉換。

decapitalize這個方法的注釋也寫得很清楚,注釋如下

/**
     * Utility method to take a string and convert it to normal Java variable
     * name capitalization. This normally means converting the first
     * character from upper case to lower case, but in the (unusual) special
     * case when there is more than one character and both the first and
     * second characters are upper case, we leave it alone.
     * <p>
     * Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
     * as "URL".
     *
     * @param name The string to be decapitalized.
     * @return The decapitalized version of the string.
     */

04總結

通過掃描bean注解注入IOC時,如果不指定bean名稱的默認規(guī)則是類名的首字母小寫,如果類名前兩個或以上個字母都是大寫,那么bean名稱與類名一樣。

其實這個細節(jié)可能懂的都懂,本文的彩蛋主要是分享一下平時查看源碼的一點心得吧,哈哈

到此這篇關于spring bean名稱命名的文章就介紹到這了,更多相關spring bean名稱命名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)給Word文件添加文字水印

    Java實現(xiàn)給Word文件添加文字水印

    Word中設置水印時,可預設的文字或自定義文字設置為水印效果,但通常添加水印效果時,會對所有頁面都設置成統(tǒng)一效果。本文將利用Java給Word每一頁設置不同文字水印效果,需要的可以參考一下
    2022-02-02
  • dubbo擴展點AOP切面功能擴展示例詳解

    dubbo擴展點AOP切面功能擴展示例詳解

    這篇文章主要為大家介紹了dubbo擴展點AOP切面功能擴展示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • mybatis調用存儲過程的實例代碼

    mybatis調用存儲過程的實例代碼

    這篇文章主要介紹了mybatis調用存儲過程的實例,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • SpringBoot+RabbitMQ?實現(xiàn)死信隊列的示例

    SpringBoot+RabbitMQ?實現(xiàn)死信隊列的示例

    本文主要介紹了SpringBoot+RabbitMQ?實現(xiàn)死信隊列的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • java中Calendar.add()方法的使用

    java中Calendar.add()方法的使用

    本文主要介紹了java中Calendar.add()方法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Spring在多線程下@Resource注入為null的問題

    Spring在多線程下@Resource注入為null的問題

    這篇文章主要介紹了Spring在多線程下@Resource注入為null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java實現(xiàn)把兩個有序數(shù)組合并到一個數(shù)組的實例

    java實現(xiàn)把兩個有序數(shù)組合并到一個數(shù)組的實例

    今天小編就為大家分享一篇java實現(xiàn)把兩個有序數(shù)組合并到一個數(shù)組的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Java異常分類及統(tǒng)一處理詳解

    Java異常分類及統(tǒng)一處理詳解

    這篇文章主要為大家詳細介紹了Java異常分類及統(tǒng)一處理,SpringMVC處理異常支持ajax,web.xml配置異常,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 詳解springboot測試類注解

    詳解springboot測試類注解

    這篇文章主要介紹了springboot測試類注解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • maven資源過濾打包后文件變大的處理方法

    maven資源過濾打包后文件變大的處理方法

    maven目前在web上面的使用方式很普遍,而打包的方式也存在很多方式,下面這篇文章主要給大家介紹了關于maven資源過濾打包后文件變大的處理方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07

最新評論