解讀@ConfigurationProperties和@value的區(qū)別
在 Spring Boot 中,@ConfigurationProperties 和 @Value 都是用于注入配置值的注解,但它們的設(shè)計(jì)目標(biāo)、使用場(chǎng)景和功能有顯著差異。
以下是它們的核心區(qū)別和適用場(chǎng)景:
1. 功能對(duì)比
| 特性 | @ConfigurationProperties | @Value |
|---|---|---|
| 作用范圍 | 批量綁定配置文件中的 一組相關(guān)屬性 到 Bean 的字段。 | 注入 單個(gè)屬性值 到字段或參數(shù)。 |
| 松散綁定 | 支持松散綁定(如 myProp、my-prop、MY_PROP)。 | 不支持,屬性名必須嚴(yán)格匹配。 |
| 類型安全 | 基于 類型安全的配置綁定(字段類型自動(dòng)轉(zhuǎn)換)。 | 需要手動(dòng)處理類型轉(zhuǎn)換,如 @Value("${port}") int port。 |
| SpEL 表達(dá)式 | 不支持 SpEL 表達(dá)式。 | 支持 SpEL 表達(dá)式(如 @Value("#{systemProperties['user']}"))。 |
| 默認(rèn)值 | 通過字段初始化設(shè)置默認(rèn)值(如 private String name = "default";)。 | 可在占位符中指定默認(rèn)值(如 @Value("${name:default}"))。 |
| 驗(yàn)證支持 | 支持 JSR-303 驗(yàn)證(如 @NotNull、@Size)。 | 不支持 驗(yàn)證注解。 |
| 復(fù)雜對(duì)象綁定 | 支持嵌套對(duì)象、集合、Map 等復(fù)雜結(jié)構(gòu)的綁定。 | 僅支持簡(jiǎn)單類型(需手動(dòng)拆分復(fù)雜結(jié)構(gòu))。 |
2. 使用場(chǎng)景對(duì)比
@ConfigurationProperties
適用場(chǎng)景:
- 需要將 一組相關(guān)的配置屬性 綁定到一個(gè)對(duì)象(如數(shù)據(jù)庫(kù)配置、第三方服務(wù)配置)。
- 需要類型安全、自動(dòng)轉(zhuǎn)換和松散綁定。
- 需要支持嵌套對(duì)象或集合類型(如
List、Map)。
示例一:
// 配置類定義
@Component
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceConfig {
private String url;
private String username;
private int maxPoolSize;
// Getters and Setters
}
// 業(yè)務(wù)類調(diào)用
@Service
public class DataSourceService {
@Autowired
private DataSourceConfig dataConfig; // 直接注入配置對(duì)象
public void connect() {
System.out.println("Connecting to: " + dataConfig.getUrl() + ":" + dataConfig.getUsername());
}
}
對(duì)應(yīng) application.properties
# application.properties app.datasource.url=jdbc:mysql://localhost:3306/db app.datasource.username=power app.datasource.max-pool-size=10
對(duì)應(yīng) application.yml:
app:
datasource:
url: jdbc:mysql://localhost:3306/db
username: power
maxPoolSize: 10
示例二:
- 通過 @EnableConfigurationProperties 顯式啟用
步驟:
- 在配置類或主啟動(dòng)類上使用 @EnableConfigurationProperties 注解,手動(dòng)注冊(cè)配置類14。
- 通過構(gòu)造函數(shù)或 @Autowired 注入配置對(duì)象。
代碼示例:
/ 配置類定義(無需 @Component)
@ConfigurationProperties(prefix = "app.mail")
public class MailConfig {
private String host;
private int port;
// getter/setter
}
// 主啟動(dòng)類顯式啟用
@SpringBootApplication
@EnableConfigurationProperties(MailConfig.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 業(yè)務(wù)類調(diào)用(構(gòu)造器注入)
@Service
public class MailService {
private final MailConfig mailConfig;
public MailService(MailConfig mailConfig) {
this.mailConfig = mailConfig;
}
}@Value
適用場(chǎng)景:
- 注入 單個(gè)簡(jiǎn)單值(如開關(guān)標(biāo)志、端口號(hào))。
- 需要?jiǎng)討B(tài)計(jì)算值(使用 SpEL 表達(dá)式)。
- 臨時(shí)調(diào)試或快速原型開發(fā)。
示例:
@Component
public class MyService {
@Value("${app.feature.enabled:false}")
private boolean featureEnabled;
@Value("#{systemProperties['user.timezone']}")
private String timezone;
}3. 核心區(qū)別詳解
(1) 類型安全與松散綁定
@ConfigurationProperties:
- 自動(dòng)將配置文件中的屬性轉(zhuǎn)換為字段類型(如
String→int、List)。 - 支持松散綁定(屬性名不嚴(yán)格匹配),例如
myProp、my-prop、MY_PROP都會(huì)匹配到字段myProp。
@Value:
- 需要手動(dòng)處理類型轉(zhuǎn)換(如
@Value("${port}") int port)。 - 屬性名必須嚴(yán)格匹配,否則注入失敗。
(2) 復(fù)雜對(duì)象支持
@ConfigurationProperties:
支持嵌套對(duì)象和集合:
app:
servers:
- name: server1
ip: 192.168.1.1
- name: server2
ip: 192.168.1.2@ConfigurationProperties(prefix = "app")
public class AppConfig {
private List<Server> servers;
// Getters and Setters
}@Value:
需要手動(dòng)拆分復(fù)雜結(jié)構(gòu):
@Value("${app.servers[0].name}")
private String server1Name;(3) 驗(yàn)證與默認(rèn)值
@ConfigurationProperties:
結(jié)合 @Validated 實(shí)現(xiàn)字段驗(yàn)證:
@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
@NotNull
private String name;
@Min(1)
private int maxConnections;
}@Value:
直接在占位符中設(shè)置默認(rèn)值:
@Value("${app.name:DefaultApp}")
private String appName;4. 如何選擇?
| 場(chǎng)景 | 推薦注解 |
|---|---|
| 需要綁定一組相關(guān)配置 | @ConfigurationProperties |
| 需要注入單個(gè)簡(jiǎn)單值 | @Value |
| 需要支持松散綁定或復(fù)雜結(jié)構(gòu) | @ConfigurationProperties |
| 需要使用 SpEL 動(dòng)態(tài)計(jì)算值 | @Value |
| 需要類型安全與 JSR-303 驗(yàn)證 | @ConfigurationProperties |
總結(jié)
@ConfigurationProperties:
適合 集中管理復(fù)雜配置,提供類型安全、松散綁定和驗(yàn)證支持,是 Spring Boot 推薦的配置注入方式。
@Value:
適合 快速注入簡(jiǎn)單值或動(dòng)態(tài)計(jì)算值,靈活性高但缺乏類型安全和批量綁定能力。
根據(jù)實(shí)際需求選擇合適的注解,優(yōu)先使用 @ConfigurationProperties 以提高代碼的可維護(hù)性和健壯性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot中@Value獲取值和@ConfigurationProperties獲取值用法及比較
- Spring?Boot讀取配置文件內(nèi)容的3種方式(@Value、Environment和@ConfigurationProperties)
- SpringBoot?@Value與@ConfigurationProperties二者有哪些區(qū)別
- springboot如何通過@Value,@ConfigurationProperties獲取配置
- 聊聊@value注解和@ConfigurationProperties注解的使用
- SpringBoot中注解@ConfigurationProperties與@Value的區(qū)別與使用詳解
相關(guān)文章
利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù)
Java 語言的Calendar(日歷),Date(日期),和DateFormat(日期格式)組成了Java標(biāo)準(zhǔn)的一個(gè)基本但是非常重要的部分。日期是商業(yè)邏輯計(jì)算一個(gè)關(guān)鍵的部分。下面這篇文章就給大家介紹了如何利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù),下面來一起看看吧。2016-12-12
Java Robot應(yīng)用示例之機(jī)器人功能
這篇文章主要為大家詳細(xì)介紹了Java Robot應(yīng)用示例之機(jī)器人功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
k8s部署java項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了k8s部署java項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))
這篇文章主要介紹了Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
Struts2返回json格式數(shù)據(jù)代碼實(shí)例
這篇文章主要介紹了Struts2返回json格式數(shù)據(jù)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java在高并發(fā)場(chǎng)景下實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器
點(diǎn)贊計(jì)數(shù)器的本質(zhì)就是對(duì)某個(gè)變量在高并發(fā)情況下的修改,這篇文章主要為大家介紹了Java實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器的示例代碼,感興趣的小伙伴可以了解一下2023-06-06

