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

透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

 更新時間:2023年06月23日 11:45:36   作者:烽起黎明  
Java Bean是一種 Java 編程語言編寫的可重用軟件組件,包括符合一定規(guī)范的Java 類、屬性和方法,用于描述和處理應用程序中的數(shù)據(jù)對象,下面這篇文章主要給大家介紹了關于透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則的相關資料,需要的朋友可以參考下

前言

近期在寫Spring項目的時候,需要通過注解的形式去替代之前直接將Bean存放在Spring容器這種方式,以此來簡化對于Bean對象的操作,但是這樣無法通過準確的Id去獲取到相應的Bean對象了

測試觀察

首先,如果要將指定的對象存放到Spring中,在Spring的配置文件中的掃描包路徑一定不能錯,這樣我們在這個包中所包含的類前加上【五大類注解】,就可以將對象存儲到Spring中的

<content:component-scan base-package="com.spring.demo"></content:component-scan>

然后我便在這個包下寫了個UserController 類,并且加上了【@Controller】注解,此時Spring在加載的時候就會存儲改對象

@Controller
public class UserController {
    public void SayHello(){
        System.out.println("do SayHello()");
    }
}

此時看到,我在App類中去獲取到了這個Bean對象,而且使用的是【名稱 + 類名】的形式,這種形式就可以防止Spring中存儲多個Bean對象而造成的沖突問題

但是呢,我就卡在了這里,不知道該去寫什么名稱?因為根本沒有在Spring中寫明Id值

首先我想到的是這個名稱會不會就是類名呢?但是在我進行嘗試之后卻發(fā)現(xiàn)并不是這樣,編譯器報出了異常說No bean named 'UserController' available

然后我又想到了Java的命名規(guī)范是【小駝峰】,一般去通過這個類實例化對象的時候都是將首字母進行一個小寫,其余不變,于是當我使用這個名稱進行傳遞的時候,程序運行就沒有問題了

那我首先猜測它的命名就是這樣規(guī)定的,但是有沒有特例呢?

此時我又去定義了一個類,將其類名取成了兩個大寫字母開頭的,看看這樣子的命名是否還會以【小駝峰】的形式去進行轉(zhuǎn)換

@Controller
public class SController {
    public void SayHello(){
        System.out.println("do SayHello()");
    }
}

但是當我在看運行結果的時候,卻發(fā)現(xiàn)這樣小駝峰的形式似乎行不通了

但是當我在將名稱改回【類名】的時候,卻發(fā)現(xiàn)又可以運行了,這是為什么呢?里面的轉(zhuǎn)換規(guī)則又是怎樣的?這需要我再去研究一番??

原理探究

通過上面的測試可以看出,Spring對于這個Bean對象的命名轉(zhuǎn)換是存在一定規(guī)則的,因為【在Spring中,約定大于俗成】

接下去我就通過查看Spring源碼的方式帶讀者來探究一下到底這個Spring內(nèi)部對于這個Bean的命名轉(zhuǎn)換規(guī)則是怎樣的,雖然Spring框架的代碼都是開源的,但是要精準地找到對應想要的代碼邏輯可不簡單,需要層層深入地進行探訪

1、首先第一步,我們可以按兩下【shift】鍵,便會跳出IDEA的搜索框,在這個里面你可以去搜尋當前項目中所有的類、接口,以查看它們的內(nèi)部實現(xiàn)。然后我便發(fā)現(xiàn)了一個類叫做AnnotationBeanNameGenerator,翻譯一下即為【注釋Bean名稱生成器】,那我猜測命名規(guī)范的代碼邏輯可能就在這個類中

2、當我們進入到這個類后,就可以去尋找其對應的方法了,那個方法是和BeanName有關聯(lián)的,首先點擊右側(cè)的【結構】我們便可以看到這個類中到底有哪些方法,那一看我們就可以觀察到有generateBeanName()這個方法,點到對應的方法后再進行觀察,便發(fā)現(xiàn)其最后返回時又去調(diào)用了一個方法,于是我繼續(xù)按住Ctrl鍵點進去

點進去發(fā)現(xiàn)里面又是一個方法,一些復雜的邏輯其實就是以這樣一種嵌套的形式進行的,各個類、接口之間的方法調(diào)來調(diào)去

然后看到這是下面的這個方法buildDefaultBeanName()生成默認Bean名稱

最后的話我們看到它在return的時候似乎又通過一個類名去調(diào)用了一個方法,然后傳入了這個ClassName,那我繼續(xù)點進去后就發(fā)現(xiàn)我似乎已經(jīng)不處于Spring框架的源碼中了,而是來到了JDK中

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);
}

我們可以點擊右上角的這個按鈕【選擇打開的文件】去找到這個類所對應的位置

最后我這邊順騰摸瓜地去查找就看到這個類是java.deskop包下的一個類,那么我們在查看Spring源碼的時候最終還是來到了JDK下,這個可以說明一點:Bean的命名并不是亂取的,而是使用JDK的一個命名標準去進行命名的

然后我們就可以去看看JDK中對于命名的規(guī)范到底是怎樣的??

可以看到很明顯的這里是有兩種情況,若是首字母和第二個字母都是大寫的話,那就返回原來的名稱;第二種情況則是將字符串首先轉(zhuǎn)換成了字符數(shù)組,然后再將第一位變成小寫

那看到這里的話其實我已經(jīng)是明白了,原來Spring對于Bean的這個命名規(guī)則是這樣的

總結一下

最后的話我們來總結一下本次查看源碼的收獲吧??

通過查看Spring的源碼我們進入到了JDK中,經(jīng)過代碼的閱讀將Bean的命名轉(zhuǎn)換總結了以下兩點

默認情況:使用原類名首字母小寫就能讀取到Bean對象特例:如果首字母和第二字母都是大寫的情況下,那么Bean名稱就是原類名

在學習Spring框架的過程中,初學者難免會遇到不理解的地方,因為Spring是一個IoC容器,會通過DI依賴注入的形式幫我們自動地去管理對象,所以內(nèi)部的細節(jié)便不得而知,但我們可以通過【閱讀源碼】的方式來進行理解,去看看大佬是怎么思考的??

到此這篇關于透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則的文章就介紹到這了,更多相關Bean命名轉(zhuǎn)換規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring中Service注入多個實現(xiàn)類的方法詳解

    Spring中Service注入多個實現(xiàn)類的方法詳解

    這篇文章主要介紹了Spring中Service注入多個實現(xiàn)類的方法詳解,Spring是一個開源的Java框架,用于構建企業(yè)級應用程序,它提供了許多功能,如依賴注入、面向切面編程、數(shù)據(jù)訪問、Web開發(fā)等,需要的朋友可以參考下
    2023-07-07
  • Aspectj框架實戰(zhàn)案例詳解

    Aspectj框架實戰(zhàn)案例詳解

    這篇文章主要介紹了Aspectj框架實戰(zhàn),結合具體案例形式詳細分析了Aspectj框架具體配置、使用、編譯等相關操作技巧,需要的朋友可以參考下
    2020-01-01
  • java中 String和StringBuffer的區(qū)別實例詳解

    java中 String和StringBuffer的區(qū)別實例詳解

    這篇文章主要介紹了java中 String和StringBuffer的區(qū)別實例詳解的相關資料,一個小的例子,來測試String和StringBuffer在時間和空間使用上的差別,需要的朋友可以參考下
    2017-04-04
  • Spring Hibernate實現(xiàn)分頁功能

    Spring Hibernate實現(xiàn)分頁功能

    這篇文章主要為大家詳細介紹了Spring Hibernate實現(xiàn)分頁功能的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java實現(xiàn)上傳和下載工具類

    java實現(xiàn)上傳和下載工具類

    這篇文章主要為大家詳細介紹了java實現(xiàn)上傳和下載工具類,文件上傳到ftp服務工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • @SpringBootApplication注解的使用

    @SpringBootApplication注解的使用

    這篇文章主要介紹了@SpringBootApplication注解的使用,幫助大家更好的理解和學習使用springboot框架,感興趣的朋友可以了解下
    2021-04-04
  • java多線程開啟的三種方式你知道嗎

    java多線程開啟的三種方式你知道嗎

    這篇文章主要為大家詳細介紹了java多線程開啟的三種方式,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-02-02
  • Java實現(xiàn)數(shù)組的復制及深淺拷貝的常見方法總結

    Java實現(xiàn)數(shù)組的復制及深淺拷貝的常見方法總結

    這篇文章主要為大家詳細介紹了Java中數(shù)組的復制及深淺拷貝的常見實現(xiàn)方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-01-01
  • Java生成范圍內(nèi)隨機整數(shù)的三種方法

    Java生成范圍內(nèi)隨機整數(shù)的三種方法

    在Java中生成隨機數(shù)的場景有很多,下面這篇文章主要給大家介紹了關于Java生成范圍內(nèi)隨機整數(shù)的三種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Mybatis-Plus根據(jù)時間段去查詢數(shù)據(jù)的實現(xiàn)示例

    Mybatis-Plus根據(jù)時間段去查詢數(shù)據(jù)的實現(xiàn)示例

    這篇文章主要介紹了Mybatis-Plus根據(jù)時間段去查詢數(shù)據(jù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論

册亨县| 津市市| 宿州市| 得荣县| 大宁县| 黄梅县| 云南省| 明光市| 永城市| 丁青县| 京山县| 远安县| 淮北市| 彝良县| 乡城县| 利川市| 鸡东县| 松江区| 鸡东县| 凌海市| 花垣县| 岢岚县| 南岸区| 梧州市| 肇州县| 泸西县| 中阳县| 崇左市| 渝中区| 东安县| 怀集县| 西乡县| 苏尼特左旗| 敦煌市| 都匀市| 营山县| 海原县| 通海县| 县级市| 鄢陵县| 隆德县|