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

實(shí)體類使用@Builder,導(dǎo)致@ConfigurationProperties注入屬性失敗問(wèn)題

 更新時(shí)間:2023年12月15日 14:57:33   作者:搏·夢(mèng)  
這篇文章主要介紹了實(shí)體類使用@Builder,導(dǎo)致@ConfigurationProperties注入屬性失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. 前言

這里只是列出,可能需要補(bǔ)一下的知識(shí)點(diǎn):

具體的yml文件字符串、List、Map的書寫方式并使用@ConfigurationProperties注入配置類.

使用@Builder導(dǎo)致的無(wú)法創(chuàng)建無(wú)參構(gòu)造方法

2. 場(chǎng)景

@ConfigurationProperties注入屬性,有兩個(gè)很重要的條件:

  • 該類必須是bean對(duì)象,即加了@Component注解。
  • 該類必須得有set方法,即加@Setter注解。

偶然一次發(fā)現(xiàn),當(dāng)在該類加上@Builder注解,會(huì)直接導(dǎo)致無(wú)法屬性注入。

重現(xiàn)

正常情況下:

@ToString
@Setter
@Component
@ConfigurationProperties(prefix = "failed.test")
public class demoFailedTest {

    private String username;
    private int age;
    private demoPerson demoPerson;
}

@Setter
@ToString
public class demoPerson {
    private String name;
    private String sex;
}
@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedTest demoFailedTest;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(demoFailedTest);
    }
}

failed:
  test:
    user-name: failedTest
    age: 19
    demo-person:
      name: person
      sex: boy

異常情況:當(dāng)在demoPerson類上加上@Builder注解:

@Builder
@Setter
@ToString
public class demoPerson {
    private String name;
    private String sex;
}

一開始都驚了,本來(lái)就是符合條件的,demoPerson類上面有set方法,不應(yīng)該注入不進(jìn)來(lái)。

3. 解釋

1.上面兩張圖片有個(gè)輸出有個(gè)很細(xì)微的差異,一開始我也沒有看出來(lái),后來(lái)才反應(yīng)過(guò)來(lái)了:

第一個(gè):

demoFailedTest(username=failedTest, age=19, demoPerson=demoPerson(name=person, sex=boy))

第二個(gè):

demoFailedTest(username=failedTest, age=19, demoPerson=null)

注: demoPerson類上 加了@ToString

講道理,第二個(gè)報(bào)錯(cuò)不應(yīng)該是:

demoFailedTest(username=failedTest, age=19, demoPerson=demoPerson(name=null, sex=null))

這樣子才是真正注入不進(jìn)來(lái)屬性的結(jié)果。

那么現(xiàn)在直接 demoPerson=null 代表 該demoPerson根本沒有被創(chuàng)建對(duì)象?。?!

2.后來(lái)詳細(xì)去了解了@Builder注解的作用:

詳細(xì):使用@Builder導(dǎo)致的無(wú)法創(chuàng)建無(wú)參構(gòu)造方法

簡(jiǎn)單說(shuō)一下:就是如果你只是使用了@Builder則會(huì)導(dǎo)致 該類的沒有無(wú)參構(gòu)造函數(shù),會(huì)有全參構(gòu)造函數(shù)。

3.重點(diǎn):spring屬性注入的時(shí)候,為什么要有set方法,顯示它是使用set方法注入的,它又不能直接使用對(duì)象.set方法(),想必是使用了反射,那就必須得有對(duì)象吧,可得 spring肯定是先反射創(chuàng)建對(duì)象,是的,沒錯(cuò),spring默認(rèn)是使用無(wú)參構(gòu)造函數(shù)創(chuàng)建對(duì)象,再調(diào)用反射的set方法。

4.因此,如果加上@Builder注解,會(huì)沒有無(wú)參構(gòu)造函數(shù)方法,當(dāng)然是沒有辦法創(chuàng)建對(duì)象了,因此才會(huì)出現(xiàn) demoPerson=null的結(jié)果。

4. 解決方法

具體@Builder的解決方法,上面鏈接里面有三種,我演示其中一種,即在該類上加上@AllArgsConstructor@NoArgsConstructor。

@ToString
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class demoPerson {
    private String name;
    private String sex;

}

5. 思考

根據(jù)第四大點(diǎn)的解決方法,加上@AllArgsConstructor、@NoArgsConstructor即可,但有沒有想過(guò)為什么要用@Builder方法

原因:

  • builder創(chuàng)建對(duì)象方式很優(yōu)雅,寫的很簡(jiǎn)潔。
  • 有沒有一種可能,就是需求就是不想對(duì)外提供默認(rèn)無(wú)參構(gòu)造方法,或者全參構(gòu)造方法,不想別人隨便就可以new 對(duì)象出來(lái)了。

如果要滿足第二點(diǎn)原因,顯然現(xiàn)在是無(wú)法做到的,因?yàn)閟pring使用set方法注入,得有無(wú)參構(gòu)造方法先創(chuàng)建對(duì)象,但是我們又不想提供無(wú)參構(gòu)造方法,這不是矛盾嗎?

再額外補(bǔ)充一個(gè)問(wèn)題:如果這個(gè)Person類,我只想通過(guò)配置文件注入之后,永遠(yuǎn)不被修改,固然不能提供set方法,但是因?yàn)閟pring使用set方法注入屬性,這不也是矛盾嗎?

此時(shí),突然腦子里面肯定會(huì)出現(xiàn)一個(gè)想法:為什么只會(huì)有set方法注入,不應(yīng)該吧,set都可以,應(yīng)該也可以有構(gòu)造函數(shù)注入吧。

是的,下一篇文章:

spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding 

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring IoC容器知識(shí)點(diǎn)詳解

    Spring IoC容器知識(shí)點(diǎn)詳解

    在本篇文章里小編給各位整理的是關(guān)于Spring IoC容器的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-09-09
  • Java中的SimpleDateFormat使用詳解

    Java中的SimpleDateFormat使用詳解

    SimpleDateFormat 是一個(gè)以國(guó)別敏感的方式格式化和分析數(shù)據(jù)的具體類。這篇文章主要介紹了Java中的SimpleDateFormat使用詳解,需要的朋友可以參考下
    2017-03-03
  • Java類和對(duì)象全面解析

    Java類和對(duì)象全面解析

    本文介紹了Java面向?qū)ο缶幊痰暮诵母拍?文章通過(guò)具體代碼示例,幫助讀者理解Java面向?qū)ο缶幊痰幕驹砗蛯?shí)踐方法,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • Java初始化塊及執(zhí)行過(guò)程解析

    Java初始化塊及執(zhí)行過(guò)程解析

    這篇文章主要介紹了Java初始化塊及執(zhí)行過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java中ArrayList和SubList的坑面試題

    Java中ArrayList和SubList的坑面試題

    集合是Java開發(fā)日常開發(fā)中經(jīng)常會(huì)使用到的,下面這篇文章主要給大家介紹了關(guān)于Java中ArrayList和SubList的坑面試題,需要的朋友可以參考下
    2022-05-05
  • Spring表達(dá)式語(yǔ)言SpEL用法詳解

    Spring表達(dá)式語(yǔ)言SpEL用法詳解

    這篇文章主要介紹了spring表達(dá)式語(yǔ)言SpEL用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 使用JAVA獲取nacos配置信息出現(xiàn)null,獲取不到的解決

    使用JAVA獲取nacos配置信息出現(xiàn)null,獲取不到的解決

    文章討論了在使用Java獲取Nacos配置信息時(shí)遇到的問(wèn)題,特別是調(diào)用ConfigService獲取配置時(shí)出現(xiàn)null的情況,作者嘗試了多種解決方法,最終發(fā)現(xiàn)更換jar包版本(1.*)解決了問(wèn)題,作者分享了個(gè)人經(jīng)驗(yàn),希望能對(duì)大家有所幫助
    2025-12-12
  • RestTemplate報(bào)錯(cuò)400 Bad Request的解決方案

    RestTemplate報(bào)錯(cuò)400 Bad Request的解決方案

    在使用Spring Boot時(shí),若直接通過(guò)@Autowired注入RestTemplate可能會(huì)遇到400BadRequest錯(cuò)誤,原因在于Spring Boot官方文檔指出,由于RestTemplate實(shí)例通常需要在使用前進(jìn)行定制,因此Spring Boot不會(huì)自動(dòng)配置單個(gè)RestTemplate Bean
    2024-11-11
  • SpringBoot創(chuàng)建多模塊項(xiàng)目的全過(guò)程記錄

    SpringBoot創(chuàng)建多模塊項(xiàng)目的全過(guò)程記錄

    這篇文章主要給大家介紹了關(guān)于SpringBoot創(chuàng)建多模塊項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JSP頁(yè)面無(wú)法識(shí)別EL表達(dá)式問(wèn)題解決方案

    JSP頁(yè)面無(wú)法識(shí)別EL表達(dá)式問(wèn)題解決方案

    這篇文章主要介紹了JSP頁(yè)面無(wú)法識(shí)別EL表達(dá)式問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

互助| 墨竹工卡县| 西乌| 湟源县| 五指山市| 沙洋县| 郁南县| 乌鲁木齐市| 巴塘县| 丹棱县| 龙里县| 景泰县| 房山区| 子长县| 仁化县| 启东市| 石台县| 岳普湖县| 山西省| 合阳县| 万盛区| 汕尾市| 老河口市| 武义县| 台北县| 水城县| 乾安县| 都江堰市| 太湖县| 华亭县| 凤台县| 昭通市| 河南省| 砚山县| 调兵山市| 吉首市| 长子县| 江陵县| 资中县| 营口市| 吴江市|