關于SpringBoot的@ConfigurationProperties注解和松散綁定、數(shù)據(jù)校驗
@ConfigurationProperties
源碼分析
@ConfigurationProperties
主要作用就是將prefix屬性指定的前綴配置項的值綁定到這個JavaBean上 ,通過指定的前綴,來綁定配置文件中的配置,通過如下源碼可以看出, 如果你想綁定和驗證一些外部屬性,可以將它添加到類定義或@Configuration
類中的@Bean
方法上。
標注在類上
@Data //使用該注解需要導入Lombok依賴 @Component @ConfigurationProperties(prefix = "userinfo") public class UserInfo { private String userId; private String name; }
application.yml文件配置內(nèi)容
userInfo: userId: 1001 name: lucy
接下來通過控制器方法來返回這個對象,查看數(shù)據(jù)是否綁定
@RestController public class HelloController { @Autowired private UserInfo userInfo; @GetMapping("/user") public UserInfo getUserInfo(){ return userInfo; } }
標注在方法上
上面源碼中說到可以將它添加到@Configuration
類中的@Bean
方法上,所以下面來看看標注在方法上是如何使用的!
比如我們用到druid數(shù)據(jù)源的操作,這個數(shù)據(jù)源是屬于第三方的,所以我們不能操作源碼,不能再源碼里面找到它的對象來給他添加注解,但我們可以在yml文件中給他配置,來拿到它的屬性。
首先添加所需的依賴
<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)建一個配置類,然后在類方法上添加注解,并通過prefix綁定數(shù)據(jù)
@SpringBootConfiguration public class DatasourceConfig { @Bean @ConfigurationProperties(prefix = "spring.database.druid") public DataSource database(){ return new DruidDataSource(); } }
通過控制器方法來檢驗綁定效果
@RestController public class HelloController { @Autowired private DataSource dataSource; @GetMapping("/datasource") public void getDataSource(){ System.out.println(dataSource); } }
訪問//localhost/datasource
,查看控制臺輸出?。?!
松散綁定
我們在使用 @ConfigurationProperties
注解的時候,@ConfigurationProperties(prefix = “userinfo”)
,這里給prefix的屬性值與yml文件中的屬性名稱不一致,但是依舊綁定成功了!原因是什么呢?
這就需要提到Spring的松散綁定屬性規(guī)則。因此使用以下方式書寫都能與類的屬性名稱匹配。
userInfo: userId: 1001 # 駝峰命名方式 #user_id: 1002 #下劃線方式 #user-id: 1003 #烤肉串方式 #USER_ID: 1004 # 常量方式 name: lucycd
需要注意的是,prefix的屬性值必須全部為小寫,就像下圖所示,就會報錯:前綴必須是規(guī)范形式。
運行程序,也會在控制臺提示你:配置屬性名稱“userInfo
”無效;無效字符:“I”
數(shù)據(jù)校驗
Spring Boot中有很多配置文件,配置文件中我們可以自定義一些對應的屬性值。那么這些屬性值是否合法呢?我們?nèi)绾蝸硇r灒吭贘ava中有一種JSR303規(guī)范,我們可以針對一些對應的數(shù)值來進行校驗。按照規(guī)范來進行書寫,如果不符合要求就說明校驗失敗,反之,則成功!
SpringBoot也給出了強大的數(shù)據(jù)校驗功能,可以有效的避免此類問題的發(fā)生。在JAVA EE的JSR303規(guī)范中給出了具體的數(shù)據(jù)校驗標準,開發(fā)者可以根據(jù)自己的需要選擇對應的校驗框架,此處使用Hibernate提供的校驗框架來作為實現(xiàn)進行數(shù)據(jù)校驗。
導入驗證包和校驗實現(xiàn)包
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
添加注解@Validated
給屬性添加驗證規(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長度應該在2-5之間") private String name; }
這里我們先輸入不符合規(guī)范的數(shù)據(jù),來驗證數(shù)據(jù)是否能夠校驗成功
userInfo: userId: 1001 name: lucycd
編寫一個控制器方法來檢驗
@RestController public class HelloController { @Autowired private UserInfo userInfo; @GetMapping("/user") public UserInfo getUserInfo(){ return userInfo; } }
運行程序,查看控制臺,校驗成功?。?!
同樣,將數(shù)據(jù)修改為符合規(guī)則的數(shù)據(jù),程序就可以成功運行了?。?!
當然,這里的校驗規(guī)則還有許多,@NotNull
、@NotEmpty
、@Email
等等,可以根據(jù)實際情況選擇合適的注解。
到此這篇關于關于SpringBoot的@ConfigurationProperties注解和松散綁定、數(shù)據(jù)校驗的文章就介紹到這了,更多相關SpringBoot的@ConfigurationProperties注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringCloud Feign參數(shù)問題及解決方法
這篇文章主要介紹了SpringCloud Feign參數(shù)問題及解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12Java中mkdir()和mkdirs()的區(qū)別及說明
這篇文章主要介紹了Java中mkdir()和mkdirs()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11詳解SpringBoot實現(xiàn)ApplicationEvent事件的監(jiān)聽與發(fā)布
這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)ApplicationEvent事件的監(jiān)聽與發(fā)布,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-03-03解決SpringBoot中的Scheduled單線程執(zhí)行問題
在一次SpringBoot中使用Scheduled定時任務時,發(fā)現(xiàn)某一個任務出現(xiàn)執(zhí)行占用大量資源,會導致其他任務也執(zhí)行失敗,這篇文章主要介紹了SpringBoot中的Scheduled單線程執(zhí)行問題及解決方法,需要的朋友可以參考下2022-06-06Java中的CyclicBarrier循環(huán)柵欄詳解
這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄詳解,CyclicBarrier循環(huán)柵欄是用來進行線程協(xié)作,等待線程滿足某個計數(shù),構造時設置計數(shù)個數(shù),每個線程執(zhí)行到某個需要“同步”的時刻調(diào)用 await()方法進行等待,當?shù)却木€程數(shù)滿足計數(shù)個數(shù)時,繼續(xù)執(zhí)行,需要的朋友可以參考下2023-12-12如何解決Could not transfer artifact org.spri
在Maven更新過程中遇到“Could not transfer artifact org.springframework.boot”錯誤通常是由于網(wǎng)絡問題,解決方法是在Maven的設置中忽略HTTPS,添加特定語句后,可以正常下載依賴,但下載速度可能較慢,這是一種常見的解決方案,希望對遇到相同問題的人有所幫助2024-09-09