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

詳解關(guān)于spring bean名稱命名的那些事

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

前言

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

getBean(“aBService”)

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

getBean(ABService.class)

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

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

打印出來的結(jié)果,如下

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

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

02源碼查看

源碼查看有2種方式,本文的示例是springboot項(xiàng)目

01從main方法直接調(diào)試斷點(diǎn)

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

org.springframework.context.annotation.AnnotationBeanNameGenerator#generateBeanName

決定。

ps: 這種直接從main啟動(dòng)類調(diào)試起,比較適用于時(shí)間比較多,或者排查毫無頭緒

02帶著問題查看,靠猜加驗(yàn)證的方式

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

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

03源碼驗(yàn)證

從上面的分析,我們可以知道如果是掃描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);
    }

其實(shí)從代碼我們就很容易看出答案了,如果類名前兩個(gè)或以上個(gè)字母都是大寫,則beanName和類名就一樣了,不會(huì)進(jìn)行首字母小寫轉(zhuǎn)換。

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

/**
     * 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總結(jié)

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

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

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

相關(guān)文章

  • java實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))

    java實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))

    下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 關(guān)于web項(xiàng)目讀取classpath下面文件的心得分享

    關(guān)于web項(xiàng)目讀取classpath下面文件的心得分享

    這篇文章主要介紹了關(guān)于web項(xiàng)目讀取classpath下面文件的心得,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot HikariCP連接池監(jiān)控實(shí)現(xiàn)方案

    SpringBoot HikariCP連接池監(jiān)控實(shí)現(xiàn)方案

    文章介紹了五種監(jiān)控SpringBoot應(yīng)用程序中HikariCP連接池狀態(tài)和性能的工具和技術(shù),包括SpringBootActuator、Micrometer、Prometheus+Grafana、HikariCP自帶的Metrics以及NewRelic/Datadog等第三方服務(wù),每種方法都有其特點(diǎn)和配置步驟
    2025-01-01
  • 詳解Java的call by value和call by reference

    詳解Java的call by value和call by reference

    在本篇文章里小編給大家總結(jié)了關(guān)于Java的call by value和call by reference的相關(guān)用法和知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • SpringMVC中的表現(xiàn)層結(jié)果封裝

    SpringMVC中的表現(xiàn)層結(jié)果封裝

    這篇文章主要介紹了SpringMVC中的表現(xiàn)層結(jié)果封裝,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java8新特性之stream流中reduce()求和知識(shí)總結(jié)

    java8新特性之stream流中reduce()求和知識(shí)總結(jié)

    今天帶大家回顧Java8的新特性,文中對stream流中reduce()求和的相關(guān)知識(shí)作了詳細(xì)的介紹,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • mybatis返回結(jié)果為Map問題

    mybatis返回結(jié)果為Map問題

    這篇文章主要介紹了mybatis返回結(jié)果為Map問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • springboot結(jié)合前端實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能實(shí)例

    springboot結(jié)合前端實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能實(shí)例

    今天處理Springboot統(tǒng)一異常攔截的時(shí)候,遇到了頁面跳轉(zhuǎn)的問題,這篇文章主要給大家介紹了關(guān)于springboot結(jié)合前端實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • java后臺(tái)處理前端傳的json串方法

    java后臺(tái)處理前端傳的json串方法

    今天小編就為大家分享一篇java后臺(tái)處理前端傳的json串方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Java 和 Kotlin Lambda 表達(dá)式示例詳解

    Java 和 Kotlin Lambda 表達(dá)式示例詳解

    Lambda 表達(dá)式是一種簡潔的函數(shù)表達(dá)方式,可以把函數(shù)作為一個(gè)方法的參數(shù),或者將代碼塊轉(zhuǎn)換為數(shù)據(jù)傳遞,這篇文章主要介紹了Java 和 Kotlin Lambda 表達(dá)式示例詳解,需要的朋友可以參考下
    2024-06-06

最新評論

洞头县| 读书| 繁昌县| 鸡泽县| 呼伦贝尔市| 绿春县| 巨鹿县| 蒙自县| 秭归县| 霍州市| 平泉县| 三亚市| 舞钢市| 焉耆| 太和县| 邳州市| 琼结县| 沂水县| 凉山| 松滋市| 韩城市| 巴彦淖尔市| 山西省| 龙海市| 白城市| 建始县| 千阳县| 吉林省| 铅山县| 河池市| 名山县| 英超| 遂川县| 剑川县| 广丰县| 师宗县| 西吉县| 保康县| 治县。| 曲沃县| 娱乐|