SpringBoot在啓動時的多環境配置以及加載順序

  一般咱們在開發完成一個SpringBoot項目時,老是要打包部署的。java

  在啓動SpringBoot應用時,咱們經常會使用命令java -jar xxx.jar來啓動這個服務。mysql

  命令java -jar 除了啓動應用以外,還能夠在命令中指定應用的參數,好比一下帶參數的命令:spring

  (1)java -jar xxx.jar --server.port=8081,直接以命令的方式來設置服務的訪問端口server.port屬性,將端口設置爲8081;sql

  (2)java -jar -Xms1024m -Xmx1024m xxx.jar --spring.profiles.active=test ,以命令方式設置該服務啓動時的內存大小,以及設置啓動環境爲test,而且服務是後臺啓動。數據庫

  在使用命令行方式啓動SpringBoot應用時,設置參數時所使用的連續的兩個減號 -- 就是對其屬性配置文件application.properties或者application.yml中的屬性值進行賦值的標識。因此java -jar xxx.jar --server.port=8081命令,就等價於在屬性文件中添加屬性server.port=8081。app

  經過命令行的方式設置啓動參數是SpringBoot的一個重要特性,在啓動應用時,咱們不只能夠設置應用的端口、訪問路徑、運行環境,還能夠設置它的數據庫鏈接等。可是在實際生產過程當中,同一套應用程序會被應用和安裝到不一樣的環境中,同時須要設置多個參數,這樣的方式確定不可取的。以是有了SpringBoot的多環境配置。dom

  1、SpringBoot多環境配置測試

  在SpringBoot中,進行多環境配置,須要配置多個屬性文件。多環境配置的文件名須要知足application-{profile}.properties的格式,其中{profile}對應你的環境標識,好比:url

  application-dev.properties: 表示你的開發環境操作系統

  application-test.properties: 表示你的測試環境

  application-prod.properties: 表示你的生產環境

  在啓動項目的時候具體加載哪一個屬性文件,須要你在application.properties文件中經過spring.profiles.active屬性來設置,好比spring.profiles.active=test就會加載application-test.properties屬性文件。

  其中在application.properties屬性文件中配置通用內容,並設置spring.profiles.active屬性來指定啓動環境。而application-{profile}.properties屬性文件中則配置各個環境的不一樣信息,好比數據庫鏈接信息、端口以及其餘信息等。另外,雖然咱們在application.properties屬性文件中指定了啓動時的環境,咱們依然可使用java -jar xxx.jar --spring.profiles.active命令來改變它的啓動運行環境。

  在實際開發中,爲了不編寫多個屬性配置文件,咱們能夠將多個配置文件的內容,寫到一個配置文件中,這裏以一個application.yml爲例,將SpringBoot應用的dev、test、prod等環境寫到一個屬性文件中,以下:


  server:

  port: 8820

  undertow:

  worker-threads: 400

  io-threads: 100

  buffer-size: 1024

  direct-buffers: true

  spring:

  application:

  name: fuwuhao-management

  profiles:

  active: dev

  jackson:

  time-zone: GMT+8

  ---

  spring:

  profiles: dev

  datasource:

  type: com.zaxxer.hikari.HikariDataSource

  driver-class-name: com.mysql.jdbc.Driver

  hikari:

  username: root

  password: root

  jdbc-url: jdbc:mysql://127.0.0.1:3306/dataBase?autoReconnect=truecharacterEncoding=UTF-8allowMultiQueries=trueuseSSL=false

  minimum-idle: 5

  maximum-pool-size: 15

  auto-commit: true

  idle-timeout: 30002

  pool-name: DatebookHikariCP

  max-lifetime: 500000

  connection-timeout: 30001

  #connection-test-query: SELECT 1

  validation-timeout: 5000

  ---

  spring:

  profiles: test

  datasource:

  type: com.zaxxer.hikari.HikariDataSource

  driver-class-name: com.mysql.jdbc.Driver

  hikari:

  username: root

  password: root

  jdbc-url: jdbc:mysql://127.0.0.1:3306/dataBase?autoReconnect=truecharacterEncoding=UTF-8allowMultiQueries=trueuseSSL=false

  minimum-idle: 5

  maximum-pool-size: 15

  auto-commit: true

  idle-timeout: 30002

  pool-name: DatebookHikariCP

  max-lifetime: 500000

  connection-timeout: 30001

  #connection-test-query: SELECT 1

  validation-timeout: 5000

  ---

  spring:

  profiles: prod

  datasource:

  type: com.zaxxer.hikari.HikariDataSource

  driver-class-name: com.mysql.jdbc.Driver

  hikari:

  username: root

  password: root

  jdbc-url: jdbc:mysql://127.0.0.1:3306/dataBase?autoReconnect=truecharacterEncoding=UTF-8allowMultiQueries=trueuseSSL=false

  minimum-idle: 5

  maximum-pool-size: 15

  auto-commit: true

  idle-timeout: 30002

  pool-name: DatebookHikariCP

  max-lifetime: 500000

  connection-timeout: 30001

  #connection-test-query: SELECT 1

  validation-timeout: 5000


  經過這種方式的配置,就避免了寫太多的屬性文件。在啓動應用的時候,咱們可使用命令java -jar xxx.jar --spring.profiles.active=prod來隨意切換環境便可。

  2、SpringBoot啓動時加載順序

  在SpringBoot應用啓動時,將會按照下面的順序來進行屬性的加載:

  (1) 首先加載啓動命令中傳入的參數;

  (2) 加載SPRING_APPLICATION_JSON中的屬性。SPRING_APPLICATION_JSON是以JSON格式配置在系統環境變量中的內容;

  (3) 加載java:comp/dev中的JNDI屬性;

  (4) 加載Java的系統屬性,能夠經過System.getProperties()獲取到的內容;

  (5) 加載操做系統的環境變量;

  (6) 加載random.*配置的隨機屬性;

  (7) 加載位於當前應用jar包以外,針對不一樣{profile}環境的配置文件內容,好比application-{profile}.properties或者YAML定義的配置文件;

  (8) 加載位於當前應用jar包以內,針對不一樣{profile}環境的配置文件內容,好比application-{profile}.properties或者YAML定義的配置文件;

  (9) 加載位於當前應用jar包以外的application.properties和YAML配置內容;

  (10) 加載位於當前應用jar包以內的application.properties和YAML配置內容;

  (11) 加載含有@Configuration註解的類,經過@PropertySource註解定義的屬性;

  (12) 最後加載應用的默認屬性,使用SpringApplication.setDefaultProperties定義的內容。

  加載的優先級按照以上順序由高到底,數字越小的優先級越高,越先被加載。

  在這裏額外說一下(6)中提到的隨機數:

  在SpringBoot的屬性配置文件中,能夠經過使用${random}配置來產生隨機的int值、long值或者string字符串,這樣咱們就能夠容易地經過配置隨機生成屬性。

  ${random}的配置主要有如下幾種形式:

  (1)隨機字符串:

  random.stringValue=${random.value}

  (2)隨機int:

  random.intValue=${random.int}

  (3)隨機long:

  random.longValue=${random.long}

  (4)100之內的隨機數:

  random.number=${random.int(100)}

  (5)100到1000的隨機數:

  random.number=${random.int[100,1000]}



​ 

相關文章
相關標籤/搜索