一般咱們在開發完成一個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]}