SpringBoot配置文件分水嶺——高級配置的使用

      網友投稿 1048 2022-05-30

      一、前言

      大家好,我是卷心菜,大二學生一枚。這篇文章是介紹Springboot配置文件的高級使用,讀完這篇文章,各位小伙伴們可以收獲哪些呢?

      注解@ConfigurationProperties的介紹

      松散綁定、數據校驗的使用

      數據類型轉換的了解(需注意一下)

      廢話不多說,下面就開啟本章的學習。

      二、@ConfigurationProperties

      首先向大家介紹的就是注解@ConfigurationProperties的使用,它的作用是用來為bean綁定屬性的,開發者可以在yml配置文件中以對象的格式添加若干屬性,下面來舉一個例子:

      @Component @Data @ConfigurationProperties(prefix = "servers") public class ServerConfig { private String ipAddress; private int port; private long timeout; }

      這個實體類注意要提供屬性對應的setter方法

      servers: ipAddress: 192.168.0.2 port: 1111 timeout: -1

      使用@ConfigurationProperties注解就可以將配置中的屬性值關聯到實體類上,接下來寫一個測試代碼看看結果是否正確:

      @SpringBootTest class Springboot05ConfigurationApplicationTests { @Autowired private ServerConfig serverConfig; @Test void test01() { System.out.println(serverConfig); } }

      結果完全正確:

      剛才講的是給自定義的bean使用這種形式加載屬性值,如果是第三方的bean呢?能不能用這種形式加載屬性值呢?

      為什么會提出這個疑問?原因就在于當前@ConfigurationProperties注解是寫在類定義的上方,而第三方開發的bean源代碼不是我們自己寫的,我們也不可能到源代碼中去添加@ConfigurationProperties注解,這種問題該怎么解決呢?

      首先使用@Bean注解定義第三方bean

      @Bean public DruidDataSource datasource(){ DruidDataSource ds = new DruidDataSource(); return ds; }

      然后在yml中定義要綁定的屬性,注意datasource此時全小寫

      datasource: driverClassName: com.mysql.cj.jdbc.Driver

      最后使用@ConfigurationProperties注解為第三方bean進行屬性綁定,注意前綴是全小寫的datasource

      @Bean @ConfigurationProperties(prefix = "datasource") public DruidDataSource datasource(){ DruidDataSource ds = new DruidDataSource(); return ds; }

      操作方式跟剛才一樣,不同的是@ConfigurationProperties注解不僅能添加到類上,還可以添加到方法上,

      添加到類上是為spring容器管理的當前類的對象綁定屬性,添加到方法上是為spring容器管理的當前方法的返回值對象綁定屬性,本質上都一樣。

      但是目前我們定義bean不是通過類注解定義就是通過@Bean定義,使用@ConfigurationProperties注解可以為bean進行屬性綁定,那在實際工作中,哪些bean通過注解@ConfigurationProperties去綁定屬性了呢?因為這個注解不僅可以寫在類上,還可以寫在方法上,所以找起來就比較麻煩了。

      為了解決這個問題,spring給我們提供了一個全新的注解,專門標注使用@ConfigurationProperties注解綁定屬性的bean是哪些。這個注解叫做@EnableConfigurationProperties

      首先在配置類上開啟@EnableConfigurationProperties注解,并標注要使用@ConfigurationProperties注解綁定屬性的類

      @SpringBootApplication @EnableConfigurationProperties(ServerConfig.class) public class Springboot13ConfigurationApplication { }

      然后在對應的類上直接使用@ConfigurationProperties進行屬性綁定

      @Data @ConfigurationProperties(prefix = "servers") public class ServerConfig { private String ipAddress; private int port; private long timeout; }

      可能小伙伴們會說,這沒區別啊?仔細觀察,現在綁定屬性的ServerConfig類并沒有聲明@Component注解。當使用@EnableConfigurationProperties注解時,spring會默認將其標注的類定義為bean,因此無需再次聲明@Component注解了。

      注意,如果在使用@ConfigurationProperties注解時,會出現下圖的提示:

      只需要添加一個坐標就可以解決了

      org.springframework.boot spring-boot-configuration-processor

      總結

      使用@ConfigurationProperties可以為使用@Bean聲明的第三方bean綁定屬性

      當使用@EnableConfigurationProperties聲明進行屬性綁定的bean后,無需使用@Component注解再次進行bean聲明

      三、松散綁定

      在進行屬性綁定時,為了進行標準命名,我們會將屬性名嚴格按照駝峰命名法書寫,在yml配置文件中將datasource修改為dataSource,如下:

      dataSource: driverClassName: com.mysql.cj.jdbc.Driver

      此時程序可以正常運行,然后又將代碼中的前綴datasource修改為dataSource,如下:

      @Bean @ConfigurationProperties(prefix = "dataSource") public DruidDataSource datasource(){ DruidDataSource ds = new DruidDataSource(); return ds; }

      此時代碼就會報錯,為什么會出現這種問題?這就要來說一說springboot進行屬性綁定時的一個重要知識點——松散綁定

      什么是寬松綁定?是springboot進行編程時人性化設計的一種體現,即配置文件中的命名格式與變量名的命名格式可以進行格式上的最大化兼容

      在ServerConfig中的ipAddress屬性名

      SpringBoot配置文件的分水嶺——高級配置的使用

      @Component @Data @ConfigurationProperties(prefix = "servers") public class ServerConfig { private String ipAddress; }

      可以與下面的配置屬性名規則全兼容:

      servers: ipAddress: 192.168.0.2 # 駝峰模式 ip_address: 192.168.0.2 # 下劃線模式 ip-address: 192.168.0.2 # 烤肉串模式 IP_ADDRESS: 192.168.0.2 # 常量模式

      以上4種模式最終都可以匹配到ipAddress這個屬性名。為什么這樣呢?原因就是在進行匹配時,配置中的名稱要去掉中劃線和下劃線后,忽略大小寫的情況下去與java代碼中的屬性名進行忽略大小寫的等值匹配,以上4種命名去掉下劃線中劃線忽略大小寫后都是一個詞ipaddress,java代碼中的屬性名忽略大小寫后也是ipaddress,這樣就可以進行等值匹配了,這就是為什么這4種格式都能匹配成功的原因。

      不過springboot官方推薦使用烤肉串模式,也就是中劃線模式。

      注意:以上規則僅針對springboot中@ConfigurationProperties注解進行屬性綁定時有效,對@Value注解進行屬性映射無效。

      總結

      @ConfigurationProperties綁定屬性時支持屬性名寬松綁定,這個寬松體現在屬性名的命名規則上

      @Value注解不支持松散綁定規則

      綁定前綴名推薦采用烤肉串命名規則,即使用中劃線做分隔符

      四、常用計量單位綁定

      在前面的配置中,我們書寫了如下配置值,其中第三項超時時間timeout描述了服務器操作超時時間,當前值是-1表示永不超時。

      servers: ipAddress: 192.168.0.2 port: 1111 timeout: -1

      但是每個人都這個值的理解會產生不同,比如線上服務器完成一次主從備份,配置超時時間240,這個240如果單位是秒就是超時時間4分鐘,如果單位是分鐘就是超時時間4小時。面對一次線上服務器的主從備份,設置4分鐘等等。那么問題就來了,怎么解決這個誤會?

      springboot充分利用了JDK8中提供的全新的用來表示計量單位的新數據類型,用來解決這個問題。ServerConfig類中添加了兩個JDK8中新增的類,分別是Duration和DataSize

      @Component @Data @ConfigurationProperties(prefix = "servers") public class ServerConfig { @DurationUnit(ChronoUnit.HOURS) private Duration serverTimeOut; @DataSizeUnit(DataUnit.MEGABYTES) private DataSize dataSize; }

      Duration:表示時間間隔,可以通過@DurationUnit注解描述時間單位,例如上例中描述的單位為小時(ChronoUnit.HOURS)

      DataSize:表示存儲空間,可以通過@DataSizeUnit注解描述存儲空間單位,例如上例中描述的單位為MB(DataUnit.MEGABYTES)

      使用上述兩個單位就可以有效避免因溝通不同步或文檔不健全導致的信息不對稱問題,從根本上解決了問題,避免產生誤讀。

      Druation常用單位如下:

      DataSize常用單位如下:

      五、校驗

      由于無法感知模型類中的數據類型,就會出現類型不匹配的問題,比如代碼中需要int類型,配置中給了非法的數值,例如寫一個“a",這種數據肯定無法有效的綁定,還會引發錯誤。SpringBoot給出了強大的數據校驗功能,可以有效的避免此類問題的發生。

      首先開啟校驗框架,引入需要的依賴

      javax.validation validation-api org.hibernate.validator hibernate-validator

      然后在需要開啟校驗功能的類上使用注解@Validated開啟校驗功能

      @Component @Data @ConfigurationProperties(prefix = "servers") //開啟對當前bean的屬性注入校驗 @Validated public class ServerConfig { }

      最后對具體的字段設置校驗規則

      @Component @Data @ConfigurationProperties(prefix = "servers") //開啟對當前bean的屬性注入校驗 @Validated public class ServerConfig { //設置具體的規則 @Max(value = 666,message = "最大值不能超過666") @Min(value = 28,message = "最小值不能低于28") private int port; }

      總結

      開啟Bean屬性校驗功能一共3步:

      導入JSR303與Hibernate校驗框架坐標、

      使用@Validated注解啟用校驗功能

      使用具體校驗規則規范數據校驗格式

      六、數據類型轉換

      假如我們配合數據庫的配置文件是這樣的,用戶名、密碼的數值是正確的,

      注意,我這里說的是數值

      spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: 0123

      這名開發者的生日是1月23日,所以密碼就使用了0123,問題就出在這里了。

      還記得我在SpringBoot配置文件是什么?該如何使用?這篇基礎文章中的知識點嗎?

      問題就出現在了支持進制, 0123在開發者眼中是一個字符串“0123”,但是在springboot看來,這就是一個數字,而且是一個八進制的數字。當后臺使用String類型接收數據時,如果配置文件中配置了一個整數值,他是先安裝整數進行處理,讀取后再轉換成字符串。巧了,0127撞上了八進制的格式,所以最終以十進制數字83的結果存在了。

      注意點:

      字符串標準書寫加上引號包裹,養成習慣

      遇到0開頭的數據多注意

      七、總結

      樂莫樂兮新相知,很高興各位小伙伴可以堅持看完這篇文章。如果對你有幫助,可以給博主一個贊哦~~ 一起加油,一起進步!

      Java Spring Boot

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python 內置模塊之 re 庫,一文搞定正則表達式初階用法,滾雪球學 Python 第 13 篇
      下一篇:Docker這個新軟件究竟是用來干嘛的???
      相關文章
      91精品国产亚洲爽啪在线观看| 亚洲中文字幕无码爆乳app| 亚洲成AV人片在线观看无| 亚洲人AV永久一区二区三区久久| 91亚洲精品自在在线观看| 亚洲午夜在线一区| 91大神亚洲影视在线| 亚洲黄色免费电影| 亚洲精品你懂的在线观看| 亚洲线精品一区二区三区 | 亚洲最新黄色网址| 亚洲一卡2卡3卡4卡国产网站| 亚洲伊人久久大香线焦| 亚洲性线免费观看视频成熟| 亚洲中文字幕无码av| 亚洲GV天堂GV无码男同| 亚洲av无码专区国产不乱码| 久久亚洲精品无码av| 亚洲高清最新av网站| 日本系列1页亚洲系列| 亚洲裸男gv网站| 亚洲欧洲日产国码av系列天堂| 亚洲一区二区三区影院| 久久久久一级精品亚洲国产成人综合AV区| 国产亚洲老熟女视频| 亚洲国产精品乱码一区二区 | 在线观看亚洲视频| 亚洲av无码乱码在线观看野外 | 亚洲精品日韩专区silk| 亚洲国产精品综合久久2007| 91嫩草亚洲精品| 亚洲小说图区综合在线| 亚洲邪恶天堂影院在线观看| 亚洲男人电影天堂| 亚洲国产成人久久综合一区| 亚洲国产熟亚洲女视频| 国产精品亚洲一区二区在线观看 | 亚洲成色999久久网站| 亚洲精品国产福利在线观看| 亚洲乱码在线观看| 亚洲?V无码乱码国产精品|