SpringBoot中@Value獲取值和@ConfigurationProperties獲取值用法及比較
1. 簡介
1.1 @value
在Spring Boot中,@Value注解是一個非常有用的特性,它允許我們將外部的配置(如application.properties或application.yml文件中的屬性)注入到我們的Bean中。這對于讀取配置信息,如數(shù)據(jù)庫連接信息、服務(wù)地址等,非常有用。
基本用法
@Value注解可以應(yīng)用于字段、setter方法或配置方法上。它使用SpEL(Spring Expression Language)表達(dá)式來讀取配置值。
1.2 @ConfigurationProperties
@ConfigurationProperties 是 Spring Boot 提供的一個非常強(qiáng)大的注解,用于將配置文件中的屬性綁定到 Java Bean 上。與 @Value 注解相比,@ConfigurationProperties 提供了更豐富的特性,比如松散綁定(relaxed binding)、JSR-303 數(shù)據(jù)校驗(yàn)以及復(fù)雜的類型綁定等。
基本用法
- 定義一個配置類:首先,你需要定義一個配置類,并使用 @ConfigurationProperties 注解來指定配置的前綴。
- 啟用配置屬性綁定:默認(rèn)情況下,Spring Boot 會自動掃描帶有 @ConfigurationProperties 注解的類,并將它們注冊為 Spring 應(yīng)用上下文中的 bean。但是,如果你想要精確地控制哪些配置類被注冊,你可以在 @EnableConfigurationProperties 注解中指定它們。
- 在配置文件中設(shè)置屬性:在 application.properties 或 application.yml 文件中設(shè)置與配置類屬性相對應(yīng)的配置項(xiàng)。
2. 使用
2.1 @value的使用
首先創(chuàng)建springboot的項(xiàng)目
創(chuàng)建application.yml
person:
name : 岳軒子
sex : 雄
age : 18
birthday : 2002/2/31
maps : { k1 : 20 , k2 : 21}
lists : [小黃 , 小黑]
dog:
name : 旺財
創(chuàng)建Person.java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
@Validated
public class Person {
@Value("${person.name}")
private String name;
@Value("${person.sex}")
private Character sex;
@Value("${person.age}")
private Integer age;
@Value("${person.birthday}")
private Date birthday;
private Map<String, Integer> maps;
private List<String> lists;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Character getSex() {
return sex;
}
public void setSex(Character sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<String, Integer> getMaps() {
return maps;
}
public void setMaps(Map<String, Integer> maps) {
this.maps = maps;
}
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
創(chuàng)建Dog類
package com.example.springbootdaily.model;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
@Component
@Validated
public class Dog {
@Value("${person.dog.name}")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}
寫一個測試類
import com.example.springbootdaily.model.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringTest {
@Autowired
Person person;
@Test
public void print(){
System.out.println(person);
}
}
運(yùn)行結(jié)果:
Person{name='岳軒子', sex=雄, age=18, birthday=Sun Mar 03 00:00:00 CST 2002, maps=null, lists=null, dog=null}
2.2 @ConfigurationProperties的用法
創(chuàng)建Person2.java
package com.example.springbootdaily.model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person2 {
private String name;
private Character sex;
private Integer age;
private Date birthday;
private Map<String, Integer> maps;
private List<String> lists;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Character getSex() {
return sex;
}
public void setSex(Character sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<String, Integer> getMaps() {
return maps;
}
public void setMaps(Map<String, Integer> maps) {
this.maps = maps;
}
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
Dog類
package com.example.springbootdaily.model;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
@Component
@Validated
public class Dog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}
寫測試類
@Test
public void print3(){
System.out.println(person2);
}
運(yùn)行結(jié)果:
Person{name='岳軒子', sex=雄, age=18, birthday=Sun Mar 03 00:00:00 CST 2002, maps={k1=20, k2=21}, lists=[小黃, 小黑], dog=Dog{name='旺財'}}
3. 區(qū)別

3.1 松散綁定
@ConfigurationProperties 的松散綁定(relaxed binding)是 Spring Boot 提供的一個特性,它允許你在配置文件中使用不同的命名風(fēng)格(如駝峰命名、短橫線分隔等),而 Spring Boot 能夠自動地將其映射到 Java Bean 的屬性上。這種特性使得配置文件的編寫更加靈活,同時也使得 Java Bean 的屬性命名更加符合 Java 的命名習(xí)慣。
松散綁定的工作原理:
當(dāng)你使用 @ConfigurationProperties 注解來綁定配置文件中的屬性時,Spring Boot 會嘗試根據(jù)以下規(guī)則來匹配屬性名:
- 駝峰命名與短橫線分隔的互轉(zhuǎn):如果你的 Java Bean 屬性使用駝峰命名(如 myProperty),那么你可以在配置文件中使用短橫線分隔的形式(如 my-property)來設(shè)置這個屬性的值。Spring Boot 會自動地將這兩種命名風(fēng)格進(jìn)行轉(zhuǎn)換。
- 忽略大小寫:在松散綁定中,大小寫通常會被忽略,但請注意,這取決于你使用的配置文件格式(如 YAML 是大小寫敏感的,而 properties 文件則不是)。然而,即使對于大小寫敏感的文件格式,Spring Boot 也會嘗試以智能的方式匹配屬性名。
- 環(huán)境變量:對于環(huán)境變量,松散綁定的規(guī)則也適用。通常,環(huán)境變量名使用大寫字母和下劃線(如 MY_PROPERTY),而 Java Bean 屬性則使用駝峰命名。Spring Boot 能夠處理這種差異。
例子
application.yml
這里的name中間加了一個線
person:
na-me : 岳軒子
sex : 雄
age : 18
birthday : 2002/2/31
maps : { k1 : 20 , k2 : 21}
lists : [小黃 , 小黑]
dog:
name : 旺財
仍然可以獲取
運(yùn)行結(jié)果:
Person{name='岳軒子',
3.2 SpEL
SpEL(Spring Expression Language)是 Spring 框架中的一個功能強(qiáng)大的表達(dá)式語言,它支持在運(yùn)行時查詢和操作對象圖。SpEL 是一種類似于 JSP EL(JavaServer Pages Expression Language)但功能更強(qiáng)大的表達(dá)式語言,它用于在運(yùn)行時查詢和操作數(shù)據(jù)。
主要用途
Bean 屬性的動態(tài)訪問:在 Spring 配置文件中,你可以使用 SpEL 來動態(tài)地訪問和設(shè)置 Bean 的屬性。
注解中的屬性值:在 Spring 的注解中,你也可以使用 SpEL 來設(shè)置注解的屬性值。
XML 配置中的屬性值:在 Spring 的 XML 配置文件中,可以通過 標(biāo)簽的 value 或 ref 屬性結(jié)合 SpEL 來設(shè)置屬性值。
@Value 注解:在 Java 代碼中,可以使用 @Value 注解結(jié)合 SpEL 來注入配置值或計算結(jié)果。
特點(diǎn)
功能強(qiáng)大:支持基本運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算、正則表達(dá)式匹配、集合操作等。
易于使用:語法簡潔,易于學(xué)習(xí)和使用。
集成性好:與 Spring 框架緊密結(jié)合,可以在 Spring 的各種場景中使用。
例子

運(yùn)行結(jié)果
age=20,
3.3 JSP303數(shù)據(jù)校驗(yàn)
先導(dǎo)入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
這里是@Value,不支持
@Email
@Value("${person.name}")
private String name;
如果不是email的話,會報錯

3.4 復(fù)雜類型封裝
前面已經(jīng)使用了,@Value不能封裝map,list和對象類型
但是@ConfigurationProperties可以
以上就是SpringBoot中@Value獲取值和@ConfigurationProperties獲取值用法及比較的詳細(xì)內(nèi)容,更多關(guān)于@Value和@ConfigurationProperties比較的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis實(shí)現(xiàn)多表聯(lián)合查詢resultType的返回值
這篇文章主要介紹了MyBatis多表聯(lián)合查詢resultType的返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
springboot內(nèi)置tomcat調(diào)優(yōu)并發(fā)線程數(shù)解析
這篇文章主要介紹了springboot內(nèi)置tomcat調(diào)優(yōu)并發(fā)線程數(shù)解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例
本篇文章主要介紹了SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學(xué)可以了解一下。2017-03-03
SpringBoot 靜態(tài)資源導(dǎo)入及首頁設(shè)置問題
本節(jié)了解一下 SpringBoot 中 Web 開發(fā)的靜態(tài)資源導(dǎo)入和首頁設(shè)置,對應(yīng) SpringBoot-03-Web 項(xiàng)目,本節(jié)主要是從源碼的角度,研究了一下靜態(tài)資源導(dǎo)入和首頁設(shè)置的問題2021-09-09
JavaWeb實(shí)現(xiàn)郵件發(fā)送接收功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb郵件發(fā)送接收功能的實(shí)現(xiàn),郵件發(fā)送和接收功能是非常常用的功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-12-12

