Spring?boot配置綁定和配置屬性校驗的方式詳解
配置綁定
所謂配置綁定”就是把配置文件中的值與 JavaBean 中對應的屬性進行綁定。通常,我們會把一些配置信息(例如,數(shù)據(jù)庫配置)放在配置文件中,然后通過 Java 代碼去讀取該配置文件,并且把配置文件中指定的配置封裝到 JavaBean(實體類) 中。
SpringBoot 提供了以下 2 種方式進行配置綁定:
- 使用 @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 行內 person: #javabean name: abc age: 23 person2: {name: lily, age: 36 } #javabean行內 hobby: #數(shù)組 - jsp - hibernate - spring - mybatis list: # list集合 - 32 - 65 - 98 set: #set 集合 - hello - world hobby2: [23,45,56] #數(shù)組 list set 行內 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方法*************/ }
只有在容器中的組件,才會擁有 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(“#{}”)
注意: #{}是不能以第一種方式來進行取值,否則會報錯
前面已經(jīng)說了,#{}里面包含的是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:支持所有類型數(shù)據(jù)的封裝,例如 Map、 List、Set、以及對象等;
- @Value:支持基本數(shù)據(jù)類型的封裝,例如字符串、布爾值、整數(shù)等類型, 對集合Map list set配置有要求
6.屬性校驗
- @Value不支持屬性校驗
- @ConfigurationProperties 支持屬性校驗
7. 應用場景不同
@Value 和 @ConfigurationProperties 兩個注解之間,并沒有明顯的優(yōu)劣之分,它們只是適合的應用場景不同而已。
- 若只是獲取配置文件中的某項值,則推薦使用 @Value 注解;
- 若專門編寫了一個 JavaBean 來和配置文件進行映射,則建議使用 @ConfigurationProperties 注解。
我們在選用時,根據(jù)實際應用場景選擇合適的注解能達到事半功倍的效果
到此這篇關于Spring boot配置綁定和配置屬性校驗的文章就介紹到這了,更多相關Spring boot配置屬性校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟
本文主要介紹了SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Java 前臺加后臺精品圖書管理系統(tǒng)的實現(xiàn)
相信每一個學生學編程的時候,應該都會寫一個小項目——圖書管理系統(tǒng)。為什么這么說呢?我認為一個學校的氛圍很大一部分可以從圖書館的氛圍看出來,而圖書管理系統(tǒng)這個不大不小的項目,接觸的多,也比較熟悉,不會有陌生感,能夠練手,又有些難度,所以我的小項目也來了2021-11-11Spring中的@ConfigurationProperties在方法上的使用詳解
這篇文章主要介紹了Spring中的@ConfigurationProperties在方法上的使用詳解,@ConfigurationProperties應該經(jīng)常被使用到,作用在類上的時候,將該類的屬性取值?與配置文件綁定,并生成配置bean對象,放入spring容器中,提供給其他地方使用,需要的朋友可以參考下2024-01-01springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例
這篇文章主要介紹了springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例,從源碼角度分析下多級緩存實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-08-08SpringBoot項目多層級多環(huán)境yml設計詳解
這篇文章主要為大家介紹了SpringBoot項目多層級多環(huán)境yml設計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03java集合PriorityQueue優(yōu)先級隊列方法實例
這篇文章主要為大家介紹了java集合PriorityQueue優(yōu)先級隊列方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12如何使用Jackson和JSON Pointer查詢解析任何JSON節(jié)點
本文介紹了JSON Pointer是字符串表達式,可以非常方便解析復雜JSON節(jié)點值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09