解讀@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)值 | 通過(guò)字段初始化設(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
示例二:
- 通過(guò) @EnableConfigurationProperties 顯式啟用
步驟:
- 在配置類或主啟動(dòng)類上使用 @EnableConfigurationProperties 注解,手動(dòng)注冊(cè)配置類14。
- 通過(guò)構(gòu)造函數(shù)或 @Autowired 注入配置對(duì)象。
代碼示例:
/ 配置類定義(無(wú)需 @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)單值(如開(kāi)關(guān)標(biāo)志、端口號(hào))。
- 需要?jiǎng)討B(tài)計(jì)算值(使用 SpEL 表達(dá)式)。
- 臨時(shí)調(diào)試或快速原型開(kāi)發(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如何通過(guò)@Value,@ConfigurationProperties獲取配置
- 聊聊@value注解和@ConfigurationProperties注解的使用
- SpringBoot中注解@ConfigurationProperties與@Value的區(qū)別與使用詳解
相關(guān)文章
maven查看依賴樹(shù)的方法實(shí)現(xiàn)
Maven依賴樹(shù)是以當(dāng)前項(xiàng)目的POM文件為根節(jié)點(diǎn),列出了所有直接或間接依賴的依賴樹(shù)結(jié)構(gòu),本文就詳細(xì)的來(lái)介紹一下如何查看,感興趣的可以了解一下2023-08-08SpringBoot請(qǐng)求轉(zhuǎn)發(fā)的方式小結(jié)
本文主要介紹了SpringBoot請(qǐng)求轉(zhuǎn)發(fā)的方式,一共有兩大類,一種是controller控制器轉(zhuǎn)發(fā)一種是使用HttpServletRequest進(jìn)行轉(zhuǎn)發(fā),本文就詳細(xì)的介紹一下,感興趣的可以了解一下2023-09-09Springboot整合mybatis開(kāi)啟二級(jí)緩存的實(shí)現(xiàn)示例
在一級(jí)緩存中,是查詢兩次數(shù)據(jù)庫(kù)的,顯然這是一種浪費(fèi),既然SQL查詢相同,就沒(méi)有必要再次查庫(kù)了,直接利用緩存數(shù)據(jù)即可,這種思想就是MyBatis二級(jí)緩存的初衷,本文就詳細(xì)的介紹了Springboot整合mybatis開(kāi)啟二級(jí)緩存,感興趣的可以了解一下2022-05-05Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java多條件判斷場(chǎng)景中規(guī)則執(zhí)行器的設(shè)計(jì)
近日在公司領(lǐng)到一個(gè)小需求,需要對(duì)之前已有的試用用戶申請(qǐng)規(guī)則進(jìn)行拓展。本文去掉if 判斷,試試用一個(gè)規(guī)則執(zhí)行器來(lái)替代它,感興趣的可以了解一下2021-06-06Java?restTemplate發(fā)送get請(qǐng)求query參數(shù)傳遞問(wèn)題解決
這篇文章主要為大家介紹了Java?restTemplate發(fā)送get請(qǐng)求query參數(shù)傳遞問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11