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

詳解@ConfigurationProperties如何裝載到Spring容器中

 更新時間:2023年07月30日 08:22:36   作者:JAVA旭陽  
這篇文章主要為大家詳細(xì)介紹了@ConfigurationProperties該如何裝載到Spring容器中,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下

問題描述

最近項目中遇到了一個Spring@ConfigurationProperties注解的問題,如下:

1.定義了一個注解了@ConfigurationPropertiesUser Bean。

@ConfigurationProperties(prefix?=?"my.user")
@Component
@Data
public?class?User?{
????private?String?userName;
}

2.通過@Autowired使用UserBean,沒有問題。

@RestController
@RequestMapping("/config")
@EnableConfigurationProperties(User.class)
public?class?UserConfigController?{
????@Autowired
????private?User?user;
????@GetMapping("/username1")
????public?String?username1()?{
????????return?user.getUserName();
????}
}

3.但是,有個同事修改了下變量名為user1,自信的以為沒有問題,就提交測試了,然后直接報錯了。

@RestController
@RequestMapping("/config")
@EnableConfigurationProperties(User.class)
public?class?UserConfigController?{
????@Autowired
????private?User?user1;
????@GetMapping("/username2")
????public?String?username2()?{
????????return?user1.getUserName();
????}
}

報錯如下圖所示:

這是怎么一回事呢,修改個變量名都能報錯?

原因分析

根據(jù)報錯信息不難分析出來主要原因在于User類在Spring容器中兩個Bean對象,bean name分別是“user”和“my.user-com.alvinlkk.bean.User”。

使用@Autwired裝配,實際上不只是根據(jù)類型裝配,如果匹配到同類型有多個Bean對象,默認(rèn)會去找和變量名“user”同名的Bean,所以不會報錯。如果修改變量名改成user1, 它就匹配到兩個Bean對象,然后用bean name=user1無法找到合適的,自然就報錯了。

那么為什么會出現(xiàn)兩個Bean呢?

1.因為使用@Component注解,創(chuàng)建了一個名稱為“user”的Bean。

2.使用了@EnableConfigurationProperties注解創(chuàng)建了名稱為my.user-com.alvinlkk.bean.User的Bean。

最佳實踐

使用@ConfigurationProperties注解的Bean的時候,建議通過使用@EnableConfigurationProperties創(chuàng)建Bean。

源碼解析

刨根問底,我們繼續(xù)從Spring源碼層面深入了解下這個問題的產(chǎn)生的根源。Spring創(chuàng)建Bean的過程其實很簡單,大致分兩個步驟:

  • 創(chuàng)建Bean的定義信息BeanDefinition,包含Bean的類型,名稱等信息,注冊到Bean定義工廠中。
  • 根據(jù)Bean定義工廠中的Bean定義信息,創(chuàng)建出Bean實例。

上面的兩個過程中在通常在SpringBoot啟動的過程中就完成,SpringBoot啟動的時候,會調(diào)用容器的refresh(), 其中在invokeBeanFactoryPostProcessors(beanFactory)方法中創(chuàng)建并注冊BeanDefinition, 在finishBeanFactoryInitialization()方法中創(chuàng)建Bean實例對象。

創(chuàng)建注冊BeanDefinition

@Component注解

Compoent注解的的類會被Spring中的ConfigurationClassPostProcessor類處理,創(chuàng)建出對應(yīng)的BeanDefinition,然后注冊到BeanDefinitionRegistry中,具體流程如下圖所示。

@Component注解的類User會被掃描到,生成一個名字是userBeanDefinition,然后注冊到BeanDefitionRegistry中,如下圖所示:

@EnableConfigurationProperties注解

注解@EnableConfigurationProperties源碼中importEnableConfigurationPropertiesRegistrar類,那么它是在什么階段創(chuàng)建出BeanDefinition呢?

最終配置了@EnableConfigurationProperties(User.class)中被獲取,創(chuàng)建出name為my.user-com.alvinlkk.bean.UserBeanDefinition,如下圖所示。

而且@Component的順序是優(yōu)先于@EnableConfigurationProperties的。

創(chuàng)建Bean對象

現(xiàn)在BeanDefinitionBean定義信息已經(jīng)有了,Spring就可以根據(jù)這些信息創(chuàng)建出Bean對象實例了,這一個過程是在finishBeanFactoryInitialization()方法中進(jìn)行的,我們這里重點關(guān)注下@Autowird方法是如何進(jìn)行裝配的。

  • AbstractApplicationContext#refresh(): 初始化容器
  • AbstractApplicationContext#finishBeanFactoryInitialization(): 初始化Bean入口
  • DefaultListableBeanFactory#preInstantiateSingletons():預(yù)先初始化單例Bean
  • DefaultListableBeanFactory#getBean(): 調(diào)用getBean()創(chuàng)建Bean實例
  • AbstractBeanFactory#doGetBean()getBean()最終調(diào)用的方法
  • AbstractAutowireCapableBeanFactory#createBean(): 創(chuàng)建Bean實例入口
  • DefaultListableBeanFactory#determineAutowireCandidate():選擇使用哪個候選的Bean

根據(jù)類型匹配到Bean有多個的情況,會調(diào)用determineAutowireCandidate()方法進(jìn)一步去根據(jù)name匹配bean。

總結(jié)

所以對于配置注解ConfigurationProperties的類不要使用使用@Component注解讓Spring管理,更推薦的做法是使用@EnableConfigurationProperties注解進(jìn)行裝載。

以上就是詳解@ConfigurationProperties如何裝載到Spring容器中的詳細(xì)內(nèi)容,更多關(guān)于ConfigurationProperties裝載到Spring容器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Spring RestTemplate 詳解實踐使用及拓展增強

    使用Spring RestTemplate 詳解實踐使用及拓展增強

    這篇文章主要介紹了使用Spring RestTemplate 詳解實踐使用及拓展增強,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于Java回顧之多線程同步的使用詳解

    基于Java回顧之多線程同步的使用詳解

    在這篇文章里,我們關(guān)注線程同步的話題。這是比多線程更復(fù)雜,稍不留意,我們就會“掉到坑里”,而且和單線程程序不同,多線程的錯誤是否每次都出現(xiàn),也是不固定的,這給調(diào)試也帶來了很大的挑戰(zhàn)
    2013-05-05
  • java獲取優(yōu)酷視頻地址示例

    java獲取優(yōu)酷視頻地址示例

    使用JAVA解析優(yōu)酷視頻頁,得到視頻真實地址, 還可以下載,需要的朋友可以參考下
    2014-03-03
  • java引用jpython的方法示例

    java引用jpython的方法示例

    這篇文章主要介紹了java引用jpython的方法,結(jié)合實例形式分析了java引用jpython及相關(guān)使用技巧,需要的朋友可以參考下
    2016-11-11
  • maven依賴傳遞和依賴沖突原理

    maven依賴傳遞和依賴沖突原理

    這篇文章主要介紹了maven依賴傳遞和依賴沖突原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • IDEA連接達(dá)夢數(shù)據(jù)庫的詳細(xì)配置指南

    IDEA連接達(dá)夢數(shù)據(jù)庫的詳細(xì)配置指南

    達(dá)夢數(shù)據(jù)庫(DM Database)作為國產(chǎn)關(guān)系型數(shù)據(jù)庫的代表,廣泛應(yīng)用于企業(yè)級系統(tǒng)開發(fā),本文將詳細(xì)介紹如何在IntelliJ IDEA中配置并連接達(dá)夢數(shù)據(jù)庫,助力開發(fā)者高效完成數(shù)據(jù)庫開發(fā)工作,需要的朋友可以參考下
    2025-03-03
  • java 中Map詳解及實例代碼

    java 中Map詳解及實例代碼

    這篇文章主要介紹了java 中Map詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java項目編譯后target目錄詳細(xì)介紹

    Java項目編譯后target目錄詳細(xì)介紹

    Java項目中的target目錄是Maven或Gradle等構(gòu)建工具在編譯和打包過程中生成的重要輸出目錄,?這篇文章主要介紹了Java項目編譯后target目錄的相關(guān)資料,需要的朋友可以參考下
    2025-08-08
  • Java兩個變量的互換(不借助第3個變量)具體實現(xiàn)方法

    Java兩個變量的互換(不借助第3個變量)具體實現(xiàn)方法

    這篇文章主要介紹了Java兩個變量的互換(不借助第3個變量)具體實現(xiàn)方法,需要的朋友可以參考下
    2014-02-02
  • Java 如何從list中刪除符合條件的數(shù)據(jù)

    Java 如何從list中刪除符合條件的數(shù)據(jù)

    這篇文章主要介紹了Java 如何從list中刪除符合條件的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

文安县| 彰化县| 乐清市| 江西省| 阿拉善左旗| 常山县| 德化县| 永胜县| 连云港市| 社会| 迁西县| 新宾| 梁山县| 南乐县| 定州市| 桐梓县| 施甸县| 泸定县| 奉贤区| 宜君县| 河间市| 辽源市| 诸暨市| 渭南市| 桑日县| 桐梓县| 汶上县| 安阳市| 岐山县| 武隆县| 古田县| 东港市| 海丰县| 北碚区| 汕尾市| 卫辉市| 尼玛县| 上栗县| 白河县| 额济纳旗| 四子王旗|