Spring Boot設計的核心理念就是對配置信息的管理採用約定優於配置,基於此理念咱們開發過程當中會大量的採用Spring Boot提供的默認項,相比傳統的Spring Framework框架大大下降的配置項的數量,本文將詳細介紹基於Spring Boot 2.x的配置體系,包括配置文件的介紹、如何自定義配置項、如何獲取配置文件中的配置項、以及如何經過Profile實現特定的環境使用特定的配置。java
Spring Boot 使用了一個全局的配置文件application.properties,該文件放置在src/main/resources目錄下,同時還支持yaml語言的配置文件,對應的配置文件是application.yml。git
yaml是強調以數據爲中心,而不是以標記語言爲重點,能夠簡單表達清單、散列表,標量等數據形態,特別適合用來表達或編輯數據結構、各類配置文件。github
application配置文件有2個做用,第一能夠對Spring Boot默認的配置項進行修改,第二能夠自定義配置項。spring
例如,Spring Boot內嵌的Tomcat的默認端口8080修改爲9000,將上下文默認路徑「/」修改成"/configuration",能夠在application.properties中添加:後端
server.port=9000 server.servlet.context-path=/configuration
或在application.yml中添加:springboot
server: port: 9000 servlet: context-path: /configuration
從上面的配置能夠看出,在Spring Boot中,context-path、contextPath、CONTEXT_PATH形式實際上是通用的。採用yaml的配置功能更增強大👍,而且簡潔清晰,在平常開發中,推薦使用yaml文件來配置。沒有特殊狀況說明,下文中的所涉及的配置項都會以yaml格式來講明。微信
Spring Boot 內置的默認配置全面且強大,但不可以徹底咱們業務開發的須要,例如,咱們對接微信公衆號開發的過程當中,須要配置微信公衆號的appId和appSecret,這些配置項咱們通常會配置到application.yml中。數據結構
建立普通的配置項app
建立自定義的配置項和上面修改Spring Boot的默認配置項的方式是同樣的,例如,咱們建立微信公衆號的appId和appSecret兩個配置項,在application.yml中添加:框架
wx: appId: 123 appSecret: xyz
使用佔位符獲取系統配置信息
想要獲取系統配置信息,咱們可使用${},以下獲取jdk版本號
java: verison: ${java.version}
一樣咱們可使用相同的方式,經過${} 佔位符引用配置文件中的其餘配置項內容,以下
system: name: configuration system: domain=health description: The system ${name} is used for ${domain}.
使用佔位符獲取maven變量
再來看一種場景,假設咱們使用 Maven 來構建應用程序,那麼能夠按以下所示的配置項來動態獲取與系統構建過程相關的信息:
info: app: encoding: @project.build.sourceEncoding@ java: source: @java.version@ target: @java.version@
使用佔位符獲取隨機值
有時候咱們須要在項目中使用一些全局隨機值,要求項目啓動時自動生成,Spring Boot支持在properties、yaml配置文件中使用相似${random.int}的表達式來聲明隨機配置的參數:
random: #32位隨機md5字符串 value: ${random.value} #隨機int int: ${random.int} #隨機long long: ${random.long} #隨機uuid uuid: ${random.uuid} #隨機10之內int int10: ${random.int[10]} #隨機取1024和65535間的int intbetween1024and65535: ${random.int[1024,65535]}
在程序開發的過程當中,如何在代碼中使用配置文件中的配置項,咱們能夠經過@value注入值,以下在controller中獲取微信公衆號的appId和appSecret:
@RestController public class ConfigurationController { @Value("${wx.appId}") private String appId; @Value("${wx.appSecret}") private String appSecret; @RequestMapping("/wx-info") public String wxInfo() { return "appId: " + appId + ",appSecret:" + appSecret; } }
這種方法會形成contrller有太多的配置項,針對這種狀況咱們能夠構建一個配置類WxConfig,以下:
@Component @Data public class WxConfig { @Value("${wx.appId}") private String appId; @Value("${wx.appSecret}") private String appSecret; } @RestController public class WxConfigController { @Resource private WxConfig wxConfig; @RequestMapping("/wx-config") public String wxConfig() { return "appId: " + wxConfig.getAppId() + ",appSecret:" + wxConfig.getAppSecret(); } }
相較 @Value 註解,更爲現代的一種作法是使用 @ConfigurationProperties 註解。在使用該註解時,咱們一般會設置一個「prefix」屬性用來指定配置項的前綴,以下所示:
@Component @Data @ConfigurationProperties(prefix = "wx") public class WxConfig2 { private String appId; private String appSecret; }
經過上面的介紹,咱們知道Spring Boot 默認的全局配置文件是application.yml,可是在實際的開發過程當中,狀況就比較複雜。多環境通常指的是開發環境、測試環境、生產環境等,不一樣的環境對應的配置項會有不用,若是發佈環境的時候,去修改配置項,不只會浪費大量時間並且還很容易配置出錯。Spring Boot 提供Profile機制,Profile 本質上表明一種用於組織配置信息的維度,對不一樣環境提供不一樣配置功能,能夠經過激活、指定參數方式快速切換環境。
經過Profile來實現多環境的配置有2種方式,第一種多配置文件,第二種是yml多文檔塊。
經過這種方式來實現的多環境配置的話,配置文件以下:
/application.yml
/application-dev.yml
/application-test.yml
/application-prod.yml
yml多文檔塊
若是你想把全部的 配置信息只保存在一個文件中而不是分散在多個配置文件中,Spring Boot也能夠支持,須要作的事情只是對這些信息按 Profile 進行組織、分段,以下所示:
spring: profiles: dev #dev 環境相關配置信息 --- spring: profiles: test #test 環境相關配置信息 --- spring: profiles: prod #prod 環境相關配置信息 ---
儘管能夠在同一個配置文件中,經過文檔塊的方式來配置,仍是推薦你按多個配置文件的組織方法管理各個 Profile 配置信息,這樣纔不容易混淆和出錯。
如何激活指定的Profile
咱們能夠在全局配置文件是application.yml,經過指定配置項來激活當前的Profile:
spring:
profiles: active: dev
還可使用命令行的方式,在打包jar以後,咱們能夠直接在 java –jar 命令中添加「--spring.profiles.active」參數,以下所示:
java –jar configuration-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
這種實現方案在經過腳本進行自動化打包和部署的場景下很是有用。
在Spring Boot中,Profie這個一律唸的還能夠動態的控制代碼的執行流程,以下:
@Configuration public class DataSourceConfig { @Bean @Profile("dev") public DataSource devDataSource() { //建立 dev 環境下的 DataSource } @Bean @Profile("test") public DataSource devDataSource() { //建立 test 環境下的 DataSource } @Bean() @Profile("prod") public DataSource prodDataSource(){ //建立 prod 環境下的 DataSource } }
能夠看到,咱們構建了一個 DataSourceConfig 配置類來專門管理各個環境所需的 DataSource。這裏用@Profile註解來指定了不一樣的環境,執行建立DataSource的邏輯代碼。
@Profile 註解的應用範圍很廣,咱們能夠將它添加到包含 @Configuration 和 @Component 註解的類及其方法,也就是說能夠延伸到繼承了 @Component 註解的 @Service、@Controller、@Repository 等各類註解中。
github: https://github.com/dragon8844/springboot-learning/tree/main/configuration
若是這篇文章對您有所幫助,或者有所啓發的話,幫忙關注一下,您的支持是我堅持寫做最大的動力,多謝支持。
此外,關注公衆號:黑色的燈塔,專一Java後端技術分享,涵蓋Spring,Spring Boot,SpringCloud,Docker,Kubernetes中間件等技術。