SpringBoot 2.x 系列:配置

概覽

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註解讀取配置項

在程序開發的過程當中,如何在代碼中使用配置文件中的配置項,咱們能夠經過@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();
    }
}

使用@ConfigurationProperties註解批量讀取配置項

相較 @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

經過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

    這種實現方案在經過腳本進行自動化打包和部署的場景下很是有用。

代碼控制和Profile

在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中間件等技術。

相關文章
相關標籤/搜索