SpringBoot中@Value獲取值和@ConfigurationProperties獲取值用法及比較
1. 簡介
1.1 @value
在Spring Boot中,@Value注解是一個(gè)非常有用的特性,它允許我們將外部的配置(如application.properties或application.yml文件中的屬性)注入到我們的Bean中。這對于讀取配置信息,如數(shù)據(jù)庫連接信息、服務(wù)地址等,非常有用。
基本用法
@Value注解可以應(yīng)用于字段、setter方法或配置方法上。它使用SpEL(Spring Expression Language)表達(dá)式來讀取配置值。
1.2 @ConfigurationProperties
@ConfigurationProperties 是 Spring Boot 提供的一個(gè)非常強(qiáng)大的注解,用于將配置文件中的屬性綁定到 Java Bean 上。與 @Value 注解相比,@ConfigurationProperties 提供了更豐富的特性,比如松散綁定(relaxed binding)、JSR-303 數(shù)據(jù)校驗(yàn)以及復(fù)雜的類型綁定等。
基本用法
- 定義一個(gè)配置類:首先,你需要定義一個(gè)配置類,并使用 @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 : 旺財(cái)
創(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 + '\'' +
'}';
}
}
寫一個(gè)測試類
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='旺財(cái)'}}
3. 區(qū)別

3.1 松散綁定
@ConfigurationProperties 的松散綁定(relaxed binding)是 Spring Boot 提供的一個(gè)特性,它允許你在配置文件中使用不同的命名風(fēng)格(如駝峰命名、短橫線分隔等),而 Spring Boot 能夠自動地將其映射到 Java Bean 的屬性上。這種特性使得配置文件的編寫更加靈活,同時(shí)也使得 Java Bean 的屬性命名更加符合 Java 的命名習(xí)慣。
松散綁定的工作原理:
當(dāng)你使用 @ConfigurationProperties 注解來綁定配置文件中的屬性時(shí),Spring Boot 會嘗試根據(jù)以下規(guī)則來匹配屬性名:
- 駝峰命名與短橫線分隔的互轉(zhuǎn):如果你的 Java Bean 屬性使用駝峰命名(如 myProperty),那么你可以在配置文件中使用短橫線分隔的形式(如 my-property)來設(shè)置這個(gè)屬性的值。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中間加了一個(gè)線
person:
na-me : 岳軒子
sex : 雄
age : 18
birthday : 2002/2/31
maps : { k1 : 20 , k2 : 21}
lists : [小黃 , 小黑]
dog:
name : 旺財(cái)
仍然可以獲取
運(yùn)行結(jié)果:
Person{name='岳軒子',
3.2 SpEL
SpEL(Spring Expression Language)是 Spring 框架中的一個(gè)功能強(qiáng)大的表達(dá)式語言,它支持在運(yùn)行時(shí)查詢和操作對象圖。SpEL 是一種類似于 JSP EL(JavaServer Pages Expression Language)但功能更強(qiáng)大的表達(dá)式語言,它用于在運(yùn)行時(shí)查詢和操作數(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 來注入配置值或計(jì)算結(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的話,會報(bào)錯(cuò)

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)文章
SpringBoot + MQTT實(shí)現(xiàn)取貨就走的智能售貨柜系統(tǒng)完整流程
本文介紹了一種智能售貨柜的工作原理和實(shí)現(xiàn)流程,該系統(tǒng)通過多傳感器數(shù)據(jù)融合、實(shí)時(shí)視頻流處理和異步處理,提供無感購物體驗(yàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-03-03
Java深入講解二十三種設(shè)計(jì)模式之中的策略模式
策略模式屬于Java 23種設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下2022-05-05
spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中
這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
SpringBoot+Vue實(shí)現(xiàn)SM4加密傳輸
本文主要介紹了SpringBoot+Vue實(shí)現(xiàn)SM4加密傳輸,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
SpringBoot使用prometheus監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java8使用Supplier啟動ScheduledThread代碼實(shí)例
這篇文章主要介紹了Java8使用Supplier啟動ScheduledThread詳解,項(xiàng)目開啟立即啟動定時(shí)任務(wù)是很多項(xiàng)目都會遇到的一個(gè)需求,如何利用Java提供的函數(shù)優(yōu)雅的寫出來十分考驗(yàn)一個(gè)人的功底,需要的朋友可以參考下2024-01-01
rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼)
這篇文章主要介紹了rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
詳解Java字節(jié)碼編程之非常好用的javassist
這篇文章主要介紹了詳解Java字節(jié)碼編程之非常好用的javassist,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

