基于@Value注解和@ConfigurationProperities注解的區(qū)別及說明
一、 注解來源
使用Spring boot全局配置文件配置屬性的時(shí)候,如果配置的是spring boot內(nèi)置的屬性,那么Springboot會自動(dòng)掃描并讀取配置文件中的屬性值并覆蓋原有默認(rèn)的屬性。
如果配置的文件是用戶自定義的屬性,可以通過java代碼去讀取該配置屬性,并且把屬性綁定到bean。
在Springboot項(xiàng)目中可以通過@Value、Enviroment對象和@ConfigurationProperities注解對配置文件進(jìn)行綁定。
二、@Value注解
1. @Value注解定義
@Value注解是Spring框架提供的一個(gè)用于屬性注入的注解,它能夠?qū)⑴渲梦募械膶傩灾到壎ǖ絊pring管理的Bean對象的屬性上。
這使得開發(fā)者可以很方便地將配置信息(如數(shù)據(jù)庫連接信息、應(yīng)用設(shè)置等)從配置文件中讀取并注入到應(yīng)用程序的組件中。
2. 使用步驟
1)創(chuàng)建實(shí)體類并在屬性上使用@Value注解注入配置文件中的屬性
首先,定義一個(gè)Java類,并在類的屬性上使用@Value注解來指定要注入的配置項(xiàng)。@Value注解的value屬性用于指定配置文件中屬性的鍵名。
2)在項(xiàng)目的resource文件夾下創(chuàng)建配置文件application.yml中添加屬性信息
在Spring Boot項(xiàng)目中,通常會在src/main/resources目錄下創(chuàng)建一個(gè)名為application.yml或application.properties的配置文件,并在其中定義配置項(xiàng)。
3)在測試類中注入對象,并新增方法輸出測試
通過Spring的依賴注入機(jī)制,將使用@Value注解的Bean注入到其他需要使用這些配置信息的組件中,并編寫測試代碼來驗(yàn)證注入是否成功。
3.代碼示例
1)創(chuàng)建實(shí)體類并使用@Value注解
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MyConfigProperties {
// 使用@Value注解指定要從配置文件中注入的屬性值
@Value("${app.name}")
private String appName;// 用于存儲應(yīng)用名稱的私有屬性
@Value("${app.version}")
private String appVersion;// 用于存儲應(yīng)用版本的私有屬性
// Getters and Setters
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getAppVersion() {
return appVersion;
}
public void setAppVersion(String appVersion) {
this.appVersion = appVersion;
}
}2)在application.yml文件中添加屬性信息
app: name: MyApplication version: 1.0.0
3)在測試類或Springboot的啟動(dòng)類中注入對象并測試
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication implements CommandLineRunner {
@Autowired
private MyConfigProperties myConfigProperties;
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("Application Name: " + myConfigProperties.getAppName());
System.out.println("Application Version: " + myConfigProperties.getAppVersion());
}
}4)運(yùn)行結(jié)果:
當(dāng)運(yùn)行上述Springboot應(yīng)用時(shí),控制臺將輸出:
Application Name: MyApplication Application Version: 1.0.0
這表明MyConfigProperties類中的appName和appVersion屬性已成功從application.yml配置文件中注入。
三、Environment對象
1. Environment對象的定義
使用@Value注解的時(shí)候,將該注解標(biāo)注在Spring管控的Bean的屬性名上方,就可以將某個(gè)數(shù)據(jù)綁定到Bean對象的屬性。
當(dāng)Bean的屬性比較多且這些屬性都需要綁定配置的數(shù)據(jù)時(shí),操作起來就比較繁瑣。為此,Springboot提供了一個(gè)對象Environment,項(xiàng)目在啟動(dòng)時(shí)能夠?qū)⑴渲梦募兴袛?shù)據(jù)都封裝到該對象中,這樣就不需要手動(dòng)對配置數(shù)據(jù)進(jìn)行綁定。而且,Environment對象在獲取配置文件中的數(shù)據(jù)時(shí),不需要再提供其他實(shí)體類。
2.代碼示例
在@Value的代碼示例的測試類或Springboot的啟動(dòng)類代碼中,通過@Autowired注入Environment對象,并新增測試方法evnTest(),在測試方式桶通過Environment對象獲取配置文件中的屬性,具體代碼如下:
@Autowired
private Environment env;
@Test
void evnTest(){
System.out.println("myConfigProperties.name=" + env.getProperty("myConfigProperties.name"));
System.out.println("myConfigProperties.version=" + env.getProperty("myConfigProperties.version"));
}上述代碼的evnTest(),方法中,使用Environment對象的getProperty()方法獲取封裝到Environment對象中的配置文件的數(shù)據(jù),該方法的參數(shù)為配置數(shù)據(jù)鍵的名稱。
運(yùn)行測試方法evnTest(),控制臺會輸出以下內(nèi)容:
myConfigProperties.name=MyApplication myConfigProperties.version=1.0.0
四、@ConfigurationProperities注解

1.@ConfigurationProperities注解的定義
Java是面向?qū)ο蟮恼Z言,很多情況下,人們習(xí)慣將具有相同特性的一組數(shù)據(jù)封裝到一個(gè)對象中,Springboot中就提供了這樣的注解。Springboot的@ConfigurationProperities注解允許我們將配置文件中的屬性綁定到一個(gè)Java對象中。
這個(gè)注解通常用于將application.properties或application.yml等配置文件中的一組相關(guān)屬性封裝到一個(gè)POJO(Plain Old Java Object)中。簡單來說就是可以可以將配置文件中的一組數(shù)據(jù)同時(shí)綁定到Bean中。在項(xiàng)目中使用@ConfigurationProperities注解綁定全局配置文件中的數(shù)據(jù)。
2.@ConfigurationProperities注解使用方法
1) 創(chuàng)建一個(gè)配置類:這個(gè)類通常是一個(gè)普通的Java類,它包含了與配置文件中的屬性相對應(yīng)的字段。字段的類型應(yīng)該與配置文件中的屬性值類型相匹配。
2) 在配置類上使用@ConfigurationProperties注解:指定配置文件中的前綴(prefix),這樣Spring Boot就知道要將哪些屬性綁定到這個(gè)類的字段上。
3) 確保配置類被Spring管理:這通常通過@Component注解或通過將其作為一個(gè)Bean定義在配置類中來實(shí)現(xiàn)。
4) 在application.properties或application.yml中定義屬性:確保這些屬性的鍵名與配置類中的字段名(考慮到前綴)相匹配。
5) 使用配置類:一旦配置類被創(chuàng)建并綁定到配置文件中的屬性,你就可以在應(yīng)用程序的任何地方注入這個(gè)配置類,并使用它的字段來訪問配置屬性。
3.代碼示例
1)創(chuàng)建配置類:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name;
private int version;
// getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}2)在application.properties中定義屬性
myapp.name=My Application myapp.version=1.0.0
3)使用配置類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication implements CommandLineRunner {
@Autowired
private MyAppProperties myAppProperties;
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("Application Name: " + myAppProperties.getName());
System.out.println("Application Version: " + myAppProperties.getVersion());
}
}4)結(jié)果輸出:
Application Name: My Application Application Version: 1.0.0
在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為MyAppProperties的配置類,并使用@ConfigurationProperties(prefix = "myapp")注解將其與配置文件中以myapp為前綴的屬性綁定。
然后,在application.properties文件中定義了myapp.name和myapp.version屬性。
最后,在MyApplication類中注入了MyAppProperties對象,并在應(yīng)用程序啟動(dòng)時(shí)打印了這些屬性的值。
五、@Value注解和@ConfigurationProperities注解的對比分析
通過前面的內(nèi)容可知,@Value注解和@ConfigurationProperities注解都可以對配置文件中的屬性進(jìn)行綁定,但兩者在使用過程中還是有一些差異的。
軟件開發(fā)人員進(jìn)行技術(shù)選型時(shí),應(yīng)秉承高度的責(zé)任感,以問題為導(dǎo)向,根據(jù)實(shí)際應(yīng)用場景選擇更適合的技術(shù),并制定合理的解決方案,在復(fù)雜的業(yè)務(wù)環(huán)境下科學(xué)的做好技術(shù)選型。
下面我們來進(jìn)一步了解兩者的不同:
| 對比項(xiàng) | @Value | @ConfigurationProperities |
底層框架 | Spring | Spring Boot |
| 功能 | 單個(gè)注入配置文件的屬性 | 批量注入配置文件的屬性 |
| 為屬性設(shè)置setter方法 | 不需要 | 需要 |
| 復(fù)雜類型屬性注入 | 不支持 | 支持 |
| 松散綁定 | 不支持 | 支持 |
| JSR303數(shù)據(jù)校驗(yàn) | 不支持 | 支持 |
| SpEL表達(dá)式 | 支持 | 不支持 |
1.底層框架
@Value注解是由Spring框架提供的,只不過Springboot框架對Spring進(jìn)行了默認(rèn)支持,所以也可以使用@Value注解的相關(guān)功能;@ConfigurationProperities注解是由Springboot框架提供的。
2.功能
@Value注解只需要注入屬性值的單個(gè)屬性上進(jìn)行注入配置;@ConfigurationProperities注解主要用于將配置文件中的某一類整體批量讀取并注入到Bean的屬性中。
3.為屬性設(shè)置setter方法
@Value不需要為屬性設(shè)置setter方法,該注解會先通過表達(dá)式讀取配置文件中指定的屬性值,然后自動(dòng)注入到下方的Bean屬性上。如果讀取的配置文件屬性值為空,進(jìn)行屬性注入時(shí)程序會報(bào)錯(cuò)。
@ConfigurationProperities注解進(jìn)行配置文件屬性注入的時(shí)候,還必須為每一個(gè)屬性設(shè)置setter方法。如果配置文件中沒有配置屬性值,則會自動(dòng)將對應(yīng)的Bean屬性設(shè)置為空。
4.復(fù)雜類型屬性注入
@Value在注入復(fù)雜數(shù)據(jù)類型配置數(shù)據(jù)時(shí),會無法解析,導(dǎo)致注入失??;
@ConfigurationProperities注解支持任意數(shù)據(jù)類型的屬性注入。
5.松散綁定
@ConfigurationProperities注解進(jìn)行配置文件屬性注入時(shí),支持松散綁定語法。例如Person類中有一個(gè)字符串類型的firstName,可以綁定配置文件中的以下屬性:
person.firstName = james //標(biāo)準(zhǔn)寫法,對應(yīng)Person類屬性名 person.first-name = james //使用橫線-分隔多個(gè)單詞 person.first_name = james //使用下劃線_分隔多個(gè)單詞 PERSON.FIRST_NAME = james //使用大小寫格式,推薦常量屬性配置
上述示例中列舉了@ConfigurationProperities注解進(jìn)行配置文件屬性值注入時(shí),支持的配置文件語法,屬于松散綁定語法,而@Value注解不支持此功能。
6.JSR303數(shù)據(jù)校驗(yàn)
JSR303數(shù)據(jù)校驗(yàn)的主要作用是校驗(yàn)配置文件中注入到Bean屬性的值是否符合相關(guān)值的規(guī)則,@ConfigurationProperities注解進(jìn)行配置文件屬性注入時(shí),支持JSR303數(shù)據(jù)校驗(yàn),示例代碼如下:
@Component
@ConfigurationProperities(prefix = "person")
@Validated //引入Spring框架支持的數(shù)據(jù)校驗(yàn)規(guī)則
public class Example{
@Email //對屬性進(jìn)行規(guī)則匹配
private String email;
public void setEmail(String email){
this.email = email;
}
}在上述代碼中,使用@ConfigurationProperities注解注入配置文件屬性值時(shí),在實(shí)體類Example上引用@Validated注解用于數(shù)據(jù)校驗(yàn),在屬性email上引入@Email注解進(jìn)行對應(yīng)會澤校驗(yàn)。
如果注入的配置文件屬性值不符合相關(guān)校驗(yàn)規(guī)則,程序會自動(dòng)報(bào)錯(cuò)。@Value注解不支持JSR303數(shù)據(jù)校驗(yàn)功能。
7.SpEL表達(dá)式
使用@Value注解注入配置文件屬性時(shí),支持SpEL表達(dá)式語法,即 “ #{xx} ” 。
例如Person類中有一個(gè)整數(shù)類型id,可直接使用SpEL表達(dá)式進(jìn)行屬性注入,代碼示例如下:
@Value("#{5*2}") //使用@Value注解的SpEL表達(dá)式直接為屬性注入值
private in id;在上述代碼中,列舉了在不使用配置文件的情況下,可以直接使用@Value注解支持的SpEL表達(dá)式進(jìn)行Bean的屬性值注入,而@ConfigurationProperities注解不支持此功能。
六、總結(jié)
上述對于@Value注解和@ConfigurationProperities注解進(jìn)行配置文件屬性注入的主要區(qū)別進(jìn)行了對比分析,但兩者并沒有明顯的優(yōu)劣之分,它們只是適合的應(yīng)用場景不同而已,不同場景下的使用推薦如下:
- 如果只是針對某一個(gè)業(yè)務(wù)需求,要引入配置文件中的個(gè)別屬性,推薦使用@Value注解。
- 如果針對某個(gè)Java Bean類,需要批量注入屬性值,則推薦使用@ConfigurationProperities注解。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot用@Async注解實(shí)現(xiàn)異步任務(wù)
這篇文章主要介紹了SpringBoot用@Async注解實(shí)現(xiàn)異步任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot實(shí)現(xiàn)監(jiān)控Actuator,關(guān)閉redis監(jiān)測
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)監(jiān)控Actuator,關(guān)閉redis監(jiān)測,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
利用java模擬實(shí)現(xiàn)鍵盤鼠標(biāo)操作(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何從零設(shè)計(jì)并實(shí)現(xiàn)一個(gè)功能完備的鍵盤鼠標(biāo)模擬庫,提供比原生?Robot?更友好的?API,更高的可定制性和可擴(kuò)展性,感興趣的小伙伴可以了解一下2025-05-05
詳細(xì)介紹使用Java調(diào)用Python的四種方法
這篇文章主要給大家介紹了關(guān)于使用Java調(diào)用Python的四種方法,每種方法根據(jù)實(shí)際項(xiàng)目需求有其適用場景,其中,推薦使用Runtime.getRuntime()方法,因?yàn)樗鼮楹啙嵡乙子趯?shí)現(xiàn),需要的朋友可以參考下2024-10-10
Java微信公眾平臺開發(fā)(5) 文本及圖文消息回復(fù)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第五步,回文本及圖文消息回復(fù)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
MacBook手動(dòng)安裝多版本JDK8&17并配置靈活切換步驟
作為一名JAVA開發(fā)人員,入手一臺新電腦后免不了要配置JDK運(yùn)行環(huán)境,這篇文章主要介紹了MacBook手動(dòng)安裝多版本JDK8&17并配置靈活切換的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-03-03
SpringBoot最簡單的定時(shí)任務(wù)@Scheduler的使用及解讀
這篇文章主要介紹了SpringBoot最簡單的定時(shí)任務(wù)@Scheduler的使用及解讀,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
解決httpServletRequest.getParameter獲取不到參數(shù)的問題
這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

