Spring?boot配置綁定和配置屬性校驗的方式詳解
配置綁定
所謂配置綁定”就是把配置文件中的值與 JavaBean 中對應的屬性進行綁定。通常,我們會把一些配置信息(例如,數據庫配置)放在配置文件中,然后通過 Java 代碼去讀取該配置文件,并且把配置文件中指定的配置封裝到 JavaBean(實體類) 中。
SpringBoot 提供了以下 2 種方式進行配置綁定:
- 使用 @ConfigurationProperties 注解
- 使用 @Value 注解
先建立數據配置文件
application.yml
sb:
port: 8086
username: 'abc \n hello' #字符串
password: 6564321 #字符串
birthday: 2011/12/23 #日期
books: #map
jsp: 36
html: 78
spring: 78
books2: {jsp: 56,spring: 65,mybatis: 98} #map 行內
person: #javabean
name: abc
age: 23
person2: {name: lily, age: 36 } #javabean行內
hobby: #數組
- jsp
- hibernate
- spring
- mybatis
list: # list集合
- 32
- 65
- 98
set: #set 集合
- hello
- world
hobby2: [23,45,56] #數組 list set 行內
mapList: # 數組 list set 里存map
- jsp: 36
hibernate: 58
- html: 65
css: 98
js: 65
- {vue: 36,react: 98}
@ConfigurationProperties
通過 Spring Boot 提供的 @ConfigurationProperties 注解,可以將全局配置文件中的配置數據綁定到 JavaBean 中。
DbConfig.java
@Configuration
@ConfigurationProperties(prefix = "sb")
public class DbConfig {
String username;
String password;
Date birthday;
Map books;
Person person;
Map books2;
Person person2;
String [] hobby;
List list;
Set set ;
int [] hobby2;
List<Map> mapList;
/************省略geter/seter方法*************/
}
只有在容器中的組件,才會擁有 SpringBoot 提供的強大功能。如
果我們想要使用 @ConfigurationProperties 注解進行配置綁定,
那么首先就要保證該對 JavaBean 對象在 IoC 容器中,所以需要用
到 @Configuration 注解來添加組件到容器中。
JavaBean 上使用了注解 @ConfigurationProperties(prefix = “sb”)
,它表示將這個 JavaBean 中的所有屬性與配置文件中以“sb”為前
綴的配置進行綁定。
@Value
@Value的作用是通過注解將常量、配置文件中的值、其他bean的屬性值注入到變量中,作為變量的初始值。 @Value的值有兩類:
① ${property : default_value }
② #{ obj.property? :default_value }
第一個注入的是外部配置文件對應的property,第二個則是SpEL表達式對應的內容。
default_value,就是前面的值為空時的默認值。注意二者的不同,#{}里面那個obj代表對象。
也就是說@Value注解有兩種用法,一種是@Value(“${}”)和@Value(“#{}”),搞清楚分類后我們一一來分析。
第一種 @Value(“${}”)
controller層代碼:
@RestController
@RequestMapping("/test")
public class ValueController {
@Autowired
private CarpollingService carpollingService;
@GetMapping("/getValue")
public String getValue(){
return carpollingService.getValue();
}
}配置類代碼:
@Configuration
public class CarpollingServiceImpl {
@Value("${db.port}")
private String port;
@Override
public String getValue() {
return port;
}
}
第二種@Value(“#{}”)
注意: #{}是不能以第一種方式來進行取值,否則會報錯
前面已經說了,#{}里面包含的是obj,所以需要配合bean來使用,現(xiàn)在創(chuàng)建一個UserBean,并且給某個字段加上@Value(“#{}”)注解(按自己的需求任意添加注解)
UserBean類代碼:
@Data
@Component//添加component注解,使其注冊進容器,交由容器進行管理
public class UserBean {
private String name="張三";}controller層代碼:
@RestController
@RequestMapping("/test")
public class ValueController {
@Autowired
CarpollingServiceImpl carpollingService;
@GetMapping("/getValue")
public String getValue(){
return carpollingService.getValue();
}
}配置類代碼:
@Configuration
public class CarpollingServiceImpl {
@Value("#{userBean.name}")
private String port;
public String getValue() {
return port;
}
}
@PropertySource
如果將所有的配置都集中到 application.properties 或 application.yml
中,那么這個配置文件會十分的臃腫且難以維護,因此我們通常會將與Spring Boot 無關的配置(例如自定義配置)提取出來,寫在一個單獨的配置文件中,并在對應的 JavaBean 上使用 @PropertySource 注解指向該配置文件。
我們也可以自定義配置文件,例如新建 db.properties ,配置內容如下:
pro.username=admin
pro.password=123456
pro.birthday=2000/12/01
pro.age=23
pro.books={jsp:36,html:360,spring:65}
pro.hobby=23,34
pro.list=sprig,myatis 配置類:
@Component
@PropertySource("classpath:db.properties")
@Data
public class User {
@Value("${pro.username}")
String username;
@Value("${pro.password}")
String password;
@Value("${pro.birthday}")
Date birthday;
}注: 該注解只能引用properties文件
配置屬性校驗
自定義配置文件時,可以使用@Validated注解對注入的值進行一些簡單的校驗,示例代碼:
Testconfig.java
@Validated
@Configuration
@ConfigurationProperties(prefix = "sb")
public class Testconfig {
@Max(value = 123)
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}測試

@Autowired
Testconfig testconfig;
@Test
void a() {
System.out.println(testconfig.getPassword());
}拋出錯誤,最大值不能超過123

@Max(value = 123)注解會對注入的值進行校驗,如果不是小于123的將會報錯拋出
其它常見注解:
@AssertFalse 校驗false
@AssertTrue 校驗true
@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,
是小于等于
@DecimalMin(value=,inclusive=) 與上類似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 檢查Null
@Past 檢查日期
@Pattern(regex=,flag=) 正則
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 對po實體類進行校驗
上述的這些注解位于javax.validation.constraints包下, SpringBoot 2.3.0以后maven引用:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
@Value 與 @ConfigurationProperties對比
@Value 和 @ConfigurationProperties 注解都能讀取配置文件中的屬性值并綁定到 JavaBean 中,但兩者存在以下不同。
1. 使用位置不同
- @ConfigurationProperties:標注在 JavaBean 的類名上;
- @Value:標注在 JavaBean 的屬性上。
2. 功能不同
- @ConfigurationProperties:用于批量綁定配置文件中的配置;
- @Value:只能一個一個的指定需要綁定的配置。
3. 松散綁定支持不同
@ConfigurationProperties:支持松散綁定(松散語法),例如實體類Person 中有一個屬性為 firstName,那么配置文件中的屬性名支持以下寫法:
- person.firstName
- person.first-name
- person.first_name
- PERSON_FIRST_NAME
@Vaule:不支持松散綁定。
4. SpEL 支持不同
- @ConfigurationProperties:不支持 SpEL 表達式;
- @Value:支持 SpEL 表達式。
5. 復雜類型封裝
- @ConfigurationProperties:支持所有類型數據的封裝,例如 Map、 List、Set、以及對象等;
- @Value:支持基本數據類型的封裝,例如字符串、布爾值、整數等類型, 對集合Map list set配置有要求
6.屬性校驗
- @Value不支持屬性校驗
- @ConfigurationProperties 支持屬性校驗
7. 應用場景不同
@Value 和 @ConfigurationProperties 兩個注解之間,并沒有明顯的優(yōu)劣之分,它們只是適合的應用場景不同而已。
- 若只是獲取配置文件中的某項值,則推薦使用 @Value 注解;
- 若專門編寫了一個 JavaBean 來和配置文件進行映射,則建議使用 @ConfigurationProperties 注解。
我們在選用時,根據實際應用場景選擇合適的注解能達到事半功倍的效果
到此這篇關于Spring boot配置綁定和配置屬性校驗的文章就介紹到這了,更多相關Spring boot配置屬性校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟
本文主要介紹了SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Java 前臺加后臺精品圖書管理系統(tǒng)的實現(xiàn)
相信每一個學生學編程的時候,應該都會寫一個小項目——圖書管理系統(tǒng)。為什么這么說呢?我認為一個學校的氛圍很大一部分可以從圖書館的氛圍看出來,而圖書管理系統(tǒng)這個不大不小的項目,接觸的多,也比較熟悉,不會有陌生感,能夠練手,又有些難度,所以我的小項目也來了2021-11-11
Spring中的@ConfigurationProperties在方法上的使用詳解
這篇文章主要介紹了Spring中的@ConfigurationProperties在方法上的使用詳解,@ConfigurationProperties應該經常被使用到,作用在類上的時候,將該類的屬性取值?與配置文件綁定,并生成配置bean對象,放入spring容器中,提供給其他地方使用,需要的朋友可以參考下2024-01-01
springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例
這篇文章主要介紹了springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例,從源碼角度分析下多級緩存實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-08-08
SpringBoot項目多層級多環(huán)境yml設計詳解
這篇文章主要為大家介紹了SpringBoot項目多層級多環(huán)境yml設計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
java集合PriorityQueue優(yōu)先級隊列方法實例
這篇文章主要為大家介紹了java集合PriorityQueue優(yōu)先級隊列方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
如何使用Jackson和JSON Pointer查詢解析任何JSON節(jié)點
本文介紹了JSON Pointer是字符串表達式,可以非常方便解析復雜JSON節(jié)點值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

