網站首頁 編程語言 正文
文章目錄
- 0. 前言
- 1. 先說結論
- 2. 快速入門
- 3. 其他情況案例
- 1. 屬性不在構造函數的參數列表中,無法被注入
- 2. 使用@ConstructorBinding的類上再使用@Component注解,會報錯
0. 前言
- 前情回顧:
實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗 - 根據上一篇文章,引出如下問題:
1. 先說結論
- @ConstructorBinding注解:這個注解是SpringBoot在2.2發行版中添加的,添加該注解的屬性配置類不再需要添加Setter方法,但是需要添加構造函數,根據構造函數進行實例化屬性配置類。
- 使用@ConstructorBinding,該類得擁有 有參的構造函數方法,才可以賦值成功。
- @ConstructorBinding注解的類,此類不能加@Component類似聲明該類為bean對象的注解,因為spring創建bean的時候,有種方式叫構造函數創建bean,如果此類加上@Component,構造函數的參數,則都是去單例池中找對象并注入。
- 回答上一篇問題:
- 使用該@ConstructorBinding注解,進行構造函數方法注入屬性,可以不用set方法,因此完全可以不用提供set方法。
- 如果不想提供無參的構造函數方法,使用@Builder,因為@Builder可以把無參構造函數給抹殺掉,擁有全參構造函數,再配合@ConstructorBinding即可,屬性注入。
2. 快速入門
// @EnableConfigurationProperties的具體使用方式可以看如下:
// https://blog.csdn.net/xueyijin/article/details/124072389
@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
@Autowired
private demoFailedTest demoFailedTest;
}
@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
@AllArgsConstructor
public class demoFailedTest {
private String username;
private int age;
private demoPerson demoPerson;
}
@ToString
@AllArgsConstructor
@ConstructorBinding
public class demoPerson {
private String name;
private String sex;
}
@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {
@Autowired
demoFailedConfig demoFailedConfig;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(demoFailedConfig);
}
}
運行結果圖:
3. 其他情況案例
1. 屬性不在構造函數的參數列表中,無法被注入
@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
@Autowired
private demoFailedTest demoFailedTest;
}
@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
public class demoFailedTest {
private String username;
private int age;
private demoPerson demoPerson;
// 少了age屬性
public demoFailedTest(String username, com.example.csdn.configuration_failed_test.demoPerson demoPerson) {
this.username = username;
this.demoPerson = demoPerson;
}
}
@ToString
@ConstructorBinding
public class demoPerson {
private String name;
private String sex;
// 少了name屬性
public demoPerson(String sex) {
this.sex = sex;
}
}
@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {
@Autowired
demoFailedConfig demoFailedConfig;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(demoFailedConfig);
}
}
2. 使用@ConstructorBinding的類上再使用@Component注解,會報錯
@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
@Autowired
private demoFailedTest demoFailedTest;
}
@Component
@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
@Builder
public class demoFailedTest {
private String username;
private int age;
private demoPerson demoPerson;
}
@ToString
@ConstructorBinding
@Builder
public class demoPerson {
private String name;
private String sex;
}
@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {
@Autowired
demoFailedConfig demoFailedConfig;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(demoFailedConfig);
}
}
可以從報錯信息看出來,spring將該demoFailedTest類執行構造函數方法的時候,當成創建該類的單例bean對象,因此,該構造函數所需的參數,必然是從單例池中去找,顯示是沒有String類型的單例對象,所以報錯了。
原文鏈接:https://blog.csdn.net/xueyijin/article/details/124392887
相關推薦
- 2022-04-20 為WPF框架Prism注冊Nlog日志服務_實用技巧
- 2022-11-01 如何使用Kubernetes自定義資源(CRD)詳解_云其它
- 2023-04-19 Element UI Table常用使用方法(header-cell-style;表頭中的全選框取消
- 2022-07-28 C++圖文并茂講解繼承_C 語言
- 2022-08-10 C#并行編程Task類用法介紹_C#教程
- 2022-04-06 Go語言實現枚舉的示例代碼_Golang
- 2023-01-13 Python?CNN卷積神經網絡實戰教程深入講解_python
- 2023-03-25 Redis實現UV統計的示例代碼_Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支