Spring?boot配置綁定和配置屬性校驗(yàn)的方式詳解
配置綁定
所謂配置綁定”就是把配置文件中的值與 JavaBean 中對(duì)應(yīng)的屬性進(jìn)行綁定。通常,我們會(huì)把一些配置信息(例如,數(shù)據(jù)庫配置)放在配置文件中,然后通過 Java 代碼去讀取該配置文件,并且把配置文件中指定的配置封裝到 JavaBean(實(shí)體類) 中。
SpringBoot 提供了以下 2 種方式進(jìn)行配置綁定:
- 使用 @ConfigurationProperties 注解
- 使用 @Value 注解
先建立數(shù)據(jù)配置文件
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 行內(nèi)
person: #javabean
name: abc
age: 23
person2: {name: lily, age: 36 } #javabean行內(nèi)
hobby: #數(shù)組
- jsp
- hibernate
- spring
- mybatis
list: # list集合
- 32
- 65
- 98
set: #set 集合
- hello
- world
hobby2: [23,45,56] #數(shù)組 list set 行內(nèi)
mapList: # 數(shù)組 list set 里存map
- jsp: 36
hibernate: 58
- html: 65
css: 98
js: 65
- {vue: 36,react: 98}
@ConfigurationProperties
通過 Spring Boot 提供的 @ConfigurationProperties 注解,可以將全局配置文件中的配置數(shù)據(jù)綁定到 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方法*************/
}
只有在容器中的組件,才會(huì)擁有 SpringBoot 提供的強(qiáng)大功能。如
果我們想要使用 @ConfigurationProperties 注解進(jìn)行配置綁定,
那么首先就要保證該對(duì) JavaBean 對(duì)象在 IoC 容器中,所以需要用
到 @Configuration 注解來添加組件到容器中。
JavaBean 上使用了注解 @ConfigurationProperties(prefix = “sb”)
,它表示將這個(gè) JavaBean 中的所有屬性與配置文件中以“sb”為前
綴的配置進(jìn)行綁定。
@Value
@Value的作用是通過注解將常量、配置文件中的值、其他bean的屬性值注入到變量中,作為變量的初始值。 @Value的值有兩類:
① ${property : default_value }
② #{ obj.property? :default_value }
第一個(gè)注入的是外部配置文件對(duì)應(yīng)的property,第二個(gè)則是SpEL表達(dá)式對(duì)應(yīng)的內(nèi)容。
default_value,就是前面的值為空時(shí)的默認(rèn)值。注意二者的不同,#{}里面那個(gè)obj代表對(duì)象。
也就是說@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(“#{}”)
注意: #{}是不能以第一種方式來進(jìn)行取值,否則會(huì)報(bào)錯(cuò)
前面已經(jīng)說了,#{}里面包含的是obj,所以需要配合bean來使用,現(xiàn)在創(chuàng)建一個(gè)UserBean,并且給某個(gè)字段加上@Value(“#{}”)注解(按自己的需求任意添加注解)
UserBean類代碼:
@Data
@Component//添加component注解,使其注冊(cè)進(jìn)容器,交由容器進(jìn)行管理
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
中,那么這個(gè)配置文件會(huì)十分的臃腫且難以維護(hù),因此我們通常會(huì)將與Spring Boot 無關(guān)的配置(例如自定義配置)提取出來,寫在一個(gè)單獨(dú)的配置文件中,并在對(duì)應(yīng)的 JavaBean 上使用 @PropertySource 注解指向該配置文件。
我們也可以自定義配置文件,例如新建 db.properties ,配置內(nèi)容如下:
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文件
配置屬性校驗(yàn)
自定義配置文件時(shí),可以使用@Validated注解對(duì)注入的值進(jìn)行一些簡(jiǎn)單的校驗(yàn),示例代碼:
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;
}
}測(cè)試

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

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

