欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗問題

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

1. 前言

這里只是列出,可能需要補一下的知識點:

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

使用@Builder導致的無法創(chuàng)建無參構造方法

2. 場景

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

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

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

重現(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

異常情況:當在demoPerson類上加上@Builder注解:

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

一開始都驚了,本來就是符合條件的,demoPerson類上面有set方法,不應該注入不進來。

3. 解釋

1.上面兩張圖片有個輸出有個很細微的差異,一開始我也沒有看出來,后來才反應過來了:

第一個:

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

第二個:

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

注: demoPerson類上 加了@ToString

講道理,第二個報錯不應該是:

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

這樣子才是真正注入不進來屬性的結果。

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

2.后來詳細去了解了@Builder注解的作用:

詳細:使用@Builder導致的無法創(chuàng)建無參構造方法

簡單說一下:就是如果你只是使用了@Builder則會導致 該類的沒有無參構造函數(shù),會有全參構造函數(shù)。

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

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

4. 解決方法

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

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

}

5. 思考

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

原因:

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

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

再額外補充一個問題:如果這個Person類,我只想通過配置文件注入之后,永遠不被修改,固然不能提供set方法,但是因為spring使用set方法注入屬性,這不也是矛盾嗎?

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

是的,下一篇文章:

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

總結

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

相關文章

  • SpringBoot基于Redis實現(xiàn)生成全局唯一ID的方法

    SpringBoot基于Redis實現(xiàn)生成全局唯一ID的方法

    在項目中生成全局唯一ID有很多好處,生成全局唯一ID有助于提高系統(tǒng)的可用性、數(shù)據(jù)的完整性和安全性,同時也方便數(shù)據(jù)的管理和分析,所以本文給大家介紹了SpringBoot基于Redis實現(xiàn)生成全局唯一ID的方法,文中有詳細的代碼講解,需要的朋友可以參考下
    2023-12-12
  • 如何動態(tài)修改JavaBean中注解的參數(shù)值

    如何動態(tài)修改JavaBean中注解的參數(shù)值

    這篇文章主要介紹了如何動態(tài)修改JavaBean中注解的參數(shù)值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中的自旋鎖spinlock詳解

    Java中的自旋鎖spinlock詳解

    這篇文章主要介紹了Java中的自旋鎖spinlock詳解,自旋鎖就是循環(huán)嘗試獲取鎖,不會放棄CPU時間片,減傷cup上下文切換,缺點是循環(huán)會消耗cpu,需要的朋友可以參考下
    2024-01-01
  • Java基于Tcp的基礎聊天功能實例

    Java基于Tcp的基礎聊天功能實例

    這篇文章主要介紹了Java基于Tcp的基礎聊天功能,結合實例形式分析了java基于tcp協(xié)議的數(shù)據(jù)傳輸實現(xiàn)聊天功能相關操作技巧,需要的朋友可以參考下
    2020-01-01
  • Java中SpringCloud的五大組件詳解

    Java中SpringCloud的五大組件詳解

    這篇文章主要介紹了Java中SpringCloud的五大組件詳解,Spring cloud是一個基于Spring Boot實現(xiàn)的服務治理工具包,在微服務架構中用于管理和協(xié)調(diào)服務,需要的朋友可以參考下
    2023-07-07
  • springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案

    springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案

    這篇文章主要介紹了springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案,親測試過可以,需要的朋友可以參考下
    2018-07-07
  • SpringBoot實戰(zhàn)項目之谷歌瀏覽器全屏效果實現(xiàn)

    SpringBoot實戰(zhàn)項目之谷歌瀏覽器全屏效果實現(xiàn)

    這篇文章主要介紹了通過 Java SpringBoot來實現(xiàn)谷歌瀏覽器的全屏效果,希望頁面展示時可以實現(xiàn)全屏效果以提高用戶體驗。感興趣的小伙伴跟著小編往下看吧
    2021-09-09
  • java整合微信支付功能詳細示例

    java整合微信支付功能詳細示例

    這篇文章主要給大家介紹了關于java整合微信支付功能的相關資料,支付是一個復雜且測試起來需要的配置特別復雜的模塊,文中給出了詳細的示例代碼,需要的朋友可以參考下
    2023-07-07
  • IDEA中創(chuàng)建properties配置文件

    IDEA中創(chuàng)建properties配置文件

    我們在j2ee當中,連接數(shù)據(jù)庫的時候經(jīng)常會用到properties配置文件,本文主要介紹了IDEA中創(chuàng)建properties配置文件,具有一定的參考價值,?感興趣的可以了解一下
    2024-04-04
  • java面試LruCache?和?LinkedHashMap及算法實現(xiàn)

    java面試LruCache?和?LinkedHashMap及算法實現(xiàn)

    這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論