關(guān)于SpringBoot的@ConfigurationProperties注解和松散綁定、數(shù)據(jù)校驗(yàn)
@ConfigurationProperties
源碼分析
@ConfigurationProperties
主要作用就是將prefix屬性指定的前綴配置項(xiàng)的值綁定到這個(gè)JavaBean上 ,通過(guò)指定的前綴,來(lái)綁定配置文件中的配置,通過(guò)如下源碼可以看出, 如果你想綁定和驗(yàn)證一些外部屬性,可以將它添加到類(lèi)定義或@Configuration
類(lèi)中的@Bean
方法上。
標(biāo)注在類(lèi)上
@Data //使用該注解需要導(dǎo)入Lombok依賴(lài) @Component @ConfigurationProperties(prefix = "userinfo") public class UserInfo { private String userId; private String name; }
application.yml文件配置內(nèi)容
userInfo: userId: 1001 name: lucy
接下來(lái)通過(guò)控制器方法來(lái)返回這個(gè)對(duì)象,查看數(shù)據(jù)是否綁定
@RestController public class HelloController { @Autowired private UserInfo userInfo; @GetMapping("/user") public UserInfo getUserInfo(){ return userInfo; } }
標(biāo)注在方法上
上面源碼中說(shuō)到可以將它添加到@Configuration
類(lèi)中的@Bean
方法上,所以下面來(lái)看看標(biāo)注在方法上是如何使用的!
比如我們用到druid數(shù)據(jù)源的操作,這個(gè)數(shù)據(jù)源是屬于第三方的,所以我們不能操作源碼,不能再源碼里面找到它的對(duì)象來(lái)給他添加注解,但我們可以在yml文件中給他配置,來(lái)拿到它的屬性。
首先添加所需的依賴(lài)
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
接著在yml文件中配置數(shù)據(jù)源
spring: datasource: druid: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC username: root password: root
創(chuàng)建一個(gè)配置類(lèi),然后在類(lèi)方法上添加注解,并通過(guò)prefix綁定數(shù)據(jù)
@SpringBootConfiguration public class DatasourceConfig { @Bean @ConfigurationProperties(prefix = "spring.database.druid") public DataSource database(){ return new DruidDataSource(); } }
通過(guò)控制器方法來(lái)檢驗(yàn)綁定效果
@RestController public class HelloController { @Autowired private DataSource dataSource; @GetMapping("/datasource") public void getDataSource(){ System.out.println(dataSource); } }
訪(fǎng)問(wèn)//localhost/datasource
,查看控制臺(tái)輸出?。。?/p>
松散綁定
我們?cè)谑褂?@ConfigurationProperties
注解的時(shí)候,@ConfigurationProperties(prefix = “userinfo”)
,這里給prefix的屬性值與yml文件中的屬性名稱(chēng)不一致,但是依舊綁定成功了!原因是什么呢?
這就需要提到Spring的松散綁定屬性規(guī)則。因此使用以下方式書(shū)寫(xiě)都能與類(lèi)的屬性名稱(chēng)匹配。
userInfo: userId: 1001 # 駝峰命名方式 #user_id: 1002 #下劃線(xiàn)方式 #user-id: 1003 #烤肉串方式 #USER_ID: 1004 # 常量方式 name: lucycd
需要注意的是,prefix的屬性值必須全部為小寫(xiě),就像下圖所示,就會(huì)報(bào)錯(cuò):前綴必須是規(guī)范形式。
運(yùn)行程序,也會(huì)在控制臺(tái)提示你:配置屬性名稱(chēng)“userInfo
”無(wú)效;無(wú)效字符:“I”
數(shù)據(jù)校驗(yàn)
Spring Boot中有很多配置文件,配置文件中我們可以自定義一些對(duì)應(yīng)的屬性值。那么這些屬性值是否合法呢?我們?nèi)绾蝸?lái)校驗(yàn)?在Java中有一種JSR303規(guī)范,我們可以針對(duì)一些對(duì)應(yīng)的數(shù)值來(lái)進(jìn)行校驗(yàn)。按照規(guī)范來(lái)進(jìn)行書(shū)寫(xiě),如果不符合要求就說(shuō)明校驗(yàn)失敗,反之,則成功!
SpringBoot也給出了強(qiáng)大的數(shù)據(jù)校驗(yàn)功能,可以有效的避免此類(lèi)問(wèn)題的發(fā)生。在JAVA EE的JSR303規(guī)范中給出了具體的數(shù)據(jù)校驗(yàn)標(biāo)準(zhǔn),開(kāi)發(fā)者可以根據(jù)自己的需要選擇對(duì)應(yīng)的校驗(yàn)框架,此處使用Hibernate提供的校驗(yàn)框架來(lái)作為實(shí)現(xiàn)進(jìn)行數(shù)據(jù)校驗(yàn)。
導(dǎo)入驗(yàn)證包和校驗(yàn)實(shí)現(xiàn)包
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
添加注解@Validated
給屬性添加驗(yàn)證規(guī)則
@Data @Component @ConfigurationProperties(prefix = "userinfo") @Validated public class UserInfo { @Max(value = 1000,message = "userid超出范圍了!") @Min(value = 0,message = "userid不能小于0!") private String userId; @Size(min = 2,max = 5,message = "name長(zhǎng)度應(yīng)該在2-5之間") private String name; }
這里我們先輸入不符合規(guī)范的數(shù)據(jù),來(lái)驗(yàn)證數(shù)據(jù)是否能夠校驗(yàn)成功
userInfo: userId: 1001 name: lucycd
編寫(xiě)一個(gè)控制器方法來(lái)檢驗(yàn)
@RestController public class HelloController { @Autowired private UserInfo userInfo; @GetMapping("/user") public UserInfo getUserInfo(){ return userInfo; } }
運(yùn)行程序,查看控制臺(tái),校驗(yàn)成功?。?!
同樣,將數(shù)據(jù)修改為符合規(guī)則的數(shù)據(jù),程序就可以成功運(yùn)行了!?。?/p>
當(dāng)然,這里的校驗(yàn)規(guī)則還有許多,@NotNull
、@NotEmpty
、@Email
等等,可以根據(jù)實(shí)際情況選擇合適的注解。
到此這篇關(guān)于關(guān)于SpringBoot的@ConfigurationProperties注解和松散綁定、數(shù)據(jù)校驗(yàn)的文章就介紹到這了,更多相關(guān)SpringBoot的@ConfigurationProperties注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中的@ConfigurationProperties注解解析
- SpringBoot中@ConfigurationProperties注解的使用與源碼詳解
- SpringBoot2底層注解@ConfigurationProperties配置綁定
- SpringBoot中@ConfigurationProperties注解實(shí)現(xiàn)配置綁定的三種方法
- SpringBoot中注解@ConfigurationProperties與@Value的區(qū)別與使用詳解
- SpringBoot @ConfigurationProperties注解的簡(jiǎn)單使用
- Springboot之@ConfigurationProperties注解解讀
相關(guān)文章
spring boot 添加admin監(jiān)控的方法
這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02SpringBoot與SpringMVC中參數(shù)傳遞的原理解析
這篇文章主要介紹了SpringBoot與SpringMVC中參數(shù)傳遞的原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07JSP 開(kāi)發(fā)之 releaseSession的實(shí)例詳解
這篇文章主要介紹了JSP 開(kāi)發(fā)之 releaseSession的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07Redis實(shí)現(xiàn)商品秒殺功能頁(yè)面流程
這篇文章主要介紹了Redis實(shí)現(xiàn)商品秒殺功能的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09springboot后端如何實(shí)現(xiàn)攜帶token登陸
這篇文章主要介紹了springboot后端如何實(shí)現(xiàn)攜帶token登陸,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11SpringBoot JVM參數(shù)調(diào)優(yōu)方式
這篇文章主要介紹了SpringBoot JVM參數(shù)調(diào)優(yōu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09