成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot外化配置源碼解析:綜合實戰演示參數及配置

開發 前端
本章我們講解了關于 Spring Boot 外化配置的原理及源碼分析,本節我們通過一個具體的例子來簡單演示在 Spring Boot 中如何使用不同類型的參數及配置。本節實例涉及的部分新知識點我們也會進行簡單介紹和拓展。

綜合實戰

本章我們講解了關于 Spring Boot 外化配置的原理及源碼分析,本節我們通過一個具體的例子來簡單演示在 Spring Boot 中如何使用不同類型的參數及配置。本節實例涉及的部分新知識點我們也會進行簡單介紹和拓展。

在本節實例中,我們會用到命令行傳遞參數、默認配置文件 application.properties 及基于profile 配置參數、@Value 注解獲取參數、 基于類型安全的@ConfigurationProperties 注解關聯 Bean 等功能。

由于 Spring Boot 已經對外化配置進行了簡化處理,對照此前章節中相關原理的介紹,我們在實踐中使用起來是非常方便的。這里我創建了一個標準的 Spring Boot 項目,版本采用2.2.1.RELEASE。首先我們看一下項目的目錄結構。

 

SpringBoot外化配置源碼解析:綜合實戰演示參數及配置

在 pom.xml 中引入的核心依賴為 spring-boot-starter-web,對應依賴源碼如下。

  1. <dependency> 
  2. <groupId>org. springframework . boot</ groupId> 
  3. <artifactId>spring- boot- starter-web</artifactId> 
  4. </ dependency> 

SpringbootConfigApplication 類為 Spring Boot 項目的啟動類,我們不再做過多介紹。

ConfigController類為接收請求的 Controller, 在 其內部定義了 一 個 默 認 的getConfigParams 方法,在該方法內打印了不同途徑獲得的參數值,相關源碼如下。

 

  1. @RestController 
  2. public class ConfigController { 
  3. @Value( "${user . username}"
  4. private String username ; 
  5. @Value("${user . password}"
  6. private String password
  7. @Resource 
  8. private LoginUserConfig loginUserConfig; 
  9. @Value("${projectName :unknown}"
  10. private String projectName ; 
  11. @RequestMapping("/"
  12. public String getConfigParams() { 
  13. //啟動命令傳遞參數 
  14. System. out . println("Command config projectName:" + projectName);//通過 appl ication 配置文件配置的參數 
  15. System. out . println("Application config Username 
  16. System. out . println("Application config Password :”+ password); 
  17. //通過@ConfigurationProperties 注解配置的參數 
  18. System. out. println("ConfigurationProperties config Username :”+ login 
  19. UserConfig. 
  20. getUsername()); 
  21. System . out . println("Configurat ionProperties config Password :”+ login 
  22. UserConfig. 
  23. getPassword()); 
  24. return ""

其中通過@RestController 注解指定該類為可接收請求的 Controller,并進行實例化。在該類內部分 別通過@Value 注解、@Resource 注解來 獲取不同途徑 設置的參數。 通過getConfigParams 方法對外提供訪問請求, 當前接收到請求之后會打印不同途徑獲得參數的值。

首先我們來看通過@Value 獲取到的值的來源,在該實例中有兩個途徑來設置對應的值:

application.properties 配置文件和命令行參數。

關于命令行參數,我們之前也已經提到過,基本傳遞方式就是在執行啟動項目的命令時通過“一 name=value' 的形式進行傳遞。結合并實例,傳遞方式如下。

  1. java -jar springboot-config-0. 0.1- SNAPSHOT. jar -- projectName=SpringBoot 

在 ConfigController 類中,我們可以看到@Value 的使用基本格式為@Value("${param}"),但針對命令行參數獲取時我們采用了@Value("${param:default}")方式。在實踐中這兩種方式都比較常用,而第二種通過冒號分隔符進行傳遞默認值,當 param 參數不存在或未在application 中配置時,會使用指定的默認值。

以當前實例為例,如果啟動命令中未指定 projectName 參數,同時@Value 獲取時也未指定默認值"unknown",那么在執行啟動命令時便會拋出異常無法啟動。這是我們在使用@Value的過程中需要注意的一種情況。

關于 application.properties 配置文件中參數的設置更簡單,直接在對應文件中設置對應的key=value 值即可,比如本例中 application.properties 中的配置源碼如下。

 

  1. #公共配置,任何環境啟動均采用 8080 端 
  2. server. port=8080 
  3. spring. profiles . active=dev 

但在實踐的過程中,我們經常會遇到不同環境需要不同配置文件的情況,如果每換一-個環境就重新修改配置文件或重新打包一次會比較麻煩,這時就可以用 Spring Boot 提供的Profile 配置功能來解決問題了。而我們實例中提供的 3 個 properties 配置文件就是為了展示 Profile 配置的基本使用。

通常情況下,項目中根據環境的多少會創建 1 個到多個 properties 配置文件,一般情況下它們對應的命名格式和相關功能如下。

  • *applcation.properties:公共配置。
  • *application-dev.properties:開發環境配置。
  • .application-test.properties:測試環境配置。
  • application-prod.properties:生產環境配置。

當然,命名中的“dev'"test 和"prod”是可以自定義的,而這些配置在什么時候會被使用,則可通過激活 application.properties 配置文件中的 spring.profiles. active 參數來控制。

比如,在 applcation.properties 中進行公共配置, 然后通過如下配置激活指定環境的配置。

  1. spring. profiles.active = prod 

其中“prod”對照文件名中 application-prod.properties。Spring Boot 在處理時會獲取配置文件 applcation.properties, 然 后 通 過 指 定 的 profile 的 值 “prod" 進 行 拼 接 , 獲 得application-prod.properties 文件的名稱和路徑。 具體加載拼接的步驟和原理,我們在前面的章節中已經講過,可對照實例回顧一下。

在上述實例中,我們激活了 dev 的配置環境,application-dev.properties 中的配置如下。

 

  1. #測試環境用戶名和賬戶 
  2. user. username=test - admin 
  3. userpassword=test-pwd 

此時,通過訪問對應的請求,getConfigParams 方 法中對應打印的日志如下。

 

  1. Application config 
  2. Username : test- admin 
  3. Application config Password : test - pwd 

如果想激活生產環境的配置,只須在 application.properties 中配置spring.profiles. active=prod 即可。

@Value 參數值的獲取和基于 Profile 的參數配置我們就拓展這么多,@Value 的使用還包括注入普通字符串、操作系統屬性、表達式結果、文件資源、URL 資源等內容,大家可查閱官方文檔和相關實例進一步學習。

在上述@Value 使用中,我們可以對單個屬性進行注入配置,但如果有很多配置屬性或者配置屬性本身擁有層級結構,便顯得不夠方便靈活。因此,Spring Boo 提供了基于類型安全的配置方式。

在 ConfigController 中我們通過@Resource 注入了一個 LoginUserConfig 類,該類便是通過@ConfigurationProperties 注解將 properties 屬性和 LoginUserConfig 的屬性進行關聯,從而實現類型安全配置。LoginUserConfig 的源碼如下。

 

  1. @Component@Configurat ionProperties(prefix = "user"
  2. public class LoginUserConfig { 
  3. private String username ; 
  4. private String password
  5. //省略 getter/setter 方法 

在 LoginUserConfig 類的源代碼中,通過@ConfigurationProperties 注解指定在實例化時將前綴為 user 的配置屬性綁定到 LoginUserConfig 類的對應屬性上,而通過@Component將該類實例化。

這 里 由 于 指 定 配 置 文 件 為 dev , 則 會 將 上 述 dev 配 置 文 件 中 的 user.username 和user.password 的值分別綁定到 LoginUserConfig 類的 username 和 password 屬性上。而在 ConfigController 中注入 之后, 便可獲 得對應的屬 性值。同樣在 執行請求時 ,getConfigParams 方法中對應打印的日志如下。

  • ConfigurationProperties config Username : test - admin
  • ConfigurationProperties config Password : test- pwd

上述實例只演示了@ConfigurationProperties 綁定屬性的一種情況,Spring Boot 將 Environment 屬性綁定到@ConfigurationProperties 標注的 Bean 時,還可以使用一些寬松的規則,也就是說 Environment 屬性名和 Bean 屬性名不需要精確匹配。

比如在對象 User 中有一-個 firstName 屬性,那么在配置文件中對應如下配置項均會匹配。

  • user. firstName // 標準駝峰命名語法
  • user. first-name // 短橫線隔開表示,推薦用于. properties 和. yml 文件中
  • user. first_ name // 下劃線表示,用于. properties 和 yml 文件的可選格式
  • USER_ FIRST _NAME //大寫形式,推薦用于系統環境變量

同時,基于類型安全的屬性配置還可以結合@Validated 注解進行屬性的約束校驗,比如判斷是否非空、是否是正確的手機號(郵箱)格式、是否是正確的日期等,這里就不進行展開了。

大家可以結合本實例嘗試拓展。

最后,我們再整體回顧一-下本節實例的重 點內容,首先基于 Profile 機制我們設定了多個環境的配置文件;然后通過 spring. profiles. active 配置指定具體使用哪些環境的參數值;接著通過@Value 和@ConfigurationProperties 注解將這些配置屬性綁定到類屬性或 Bean 對象上;最后在具體的場景中獲取并使用(本實例為打印)。

在具體實踐中我們還會遇到優先級的問題,比如某些參數直接通過命令行參數進行指定,那么它將覆蓋同名的配置文件中的參數。再比如,如果將 application 配置文件放置在項目同級目錄下,它的優先級高于 jar 包內的配置等。這些內容我們在原理篇都有涉及,讀者可參考本實例進行逐一驗證學習。

小結

本章重點介紹了 Spring Boot 中參數的傳遞過程和配置文件的加載,特別是基于 profile 的加載機制。而關于加載、默認配置、配置優先級等操作,都位于 ConfigFileApplicationListener類中,該類還是值得讀者朋友花時間研究一下的。

實戰部分通過一個簡單的實例演示了部分原理的使用方法,大家可結合該實例來驗證和使用更多的相關功能。

最后,由于本章涉及源碼較多,邏輯層次較深,不同的配置模式又會形成不同的組合,形成較多的場景,因此建議在學習過程中通過 debug 來跟蹤每一步的操作,以便能夠更好地理解整個流程。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2020-10-30 13:30:26

SpringBoot代碼應用

2023-10-07 09:16:55

SpringBoot啟動流程

2021-09-08 17:20:18

DockerDockerfile程序

2010-09-13 17:45:37

2024-07-29 00:00:05

2011-10-27 10:30:55

CISCO配置命令

2024-03-12 09:50:27

Raft協議KRaft

2011-04-01 16:49:25

Cisco路由器IOS

2009-12-16 16:45:56

Cisco路由器配置

2022-07-14 14:00:01

Linux命令解析

2023-11-17 09:02:51

Nacos配置中心

2019-07-09 15:10:02

Nginx反向代理負載均衡

2021-08-27 07:47:07

Nacos灰度源碼

2022-09-15 15:25:47

spring-微服務

2018-12-24 06:49:55

SDN交換機SDN網絡架構

2009-11-17 10:36:28

路由器基礎配置

2009-04-08 10:35:00

靜態路由配置

2009-12-09 09:30:07

靜態路由配置

2010-09-25 13:31:00

TomcatJVM

2011-03-03 09:34:34

PureFTPd
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区在线 | 人人操日日干 | 2一3sex性hd| 成人亚洲视频 | 羞视频在线观看 | 日韩欧美在线一区 | 亚洲精品久久久久久下一站 | 99热最新| 国产成人综合亚洲欧美94在线 | 国产欧美精品一区二区 | 国产精品久久久久久吹潮日韩动画 | 免费在线看黄 | 亚洲码欧美码一区二区三区 | 日本电影韩国电影免费观看 | 日本在线免费看最新的电影 | 久久av网站 | 狠狠做深爱婷婷综合一区 | 日本精品一区二区三区在线观看视频 | 久久久久久久久久久福利观看 | 精品一区二区三区中文字幕 | 中文字幕免费视频 | 91极品尤物在线播放国产 | 欧美日韩黄色一级片 | 国产福利资源在线 | 久久精品黄色 | 日韩精品一区二区三区在线播放 | 日日夜夜免费精品视频 | 男女羞羞网站 | 玖玖精品 | 亚洲一区二区三区视频免费观看 | 国产精品欧美一区二区三区 | caoporn地址 | 亚洲欧美久久 | 久久久久久久久综合 | 日本天天色| 国产精品久久久久久福利一牛影视 | 99亚洲精品| 欧美久久久久久 | 国产乱码精品1区2区3区 | 毛片免费观看 | 日日爱夜夜操 |