一般在一個(gè)項(xiàng)目中,總是會(huì)有好多個(gè)環(huán)境球散。比如:
開發(fā)環(huán)境 -> 測(cè)試環(huán)境 -> 預(yù)發(fā)布環(huán)境 -> 生產(chǎn)環(huán)境
每個(gè)環(huán)境上的配置文件總是不一樣的,甚至開發(fā)環(huán)境中每個(gè)開發(fā)者的環(huán)境可能也會(huì)有一點(diǎn)不同,配置讀取可是一個(gè)讓人有點(diǎn)傷腦筋的問題漫蛔。
Spring Boot提供了一種優(yōu)先級(jí)配置讀取的機(jī)制來幫助我們從這種困境中走出來嗜愈。
常規(guī)情況下,我們都知道Spring Boot的配置會(huì)從application.properties
中讀取莽龟。實(shí)際上蠕嫁,從resource
目錄下的application.properties
文件讀取是Spring Boot配置鏈中的一環(huán)而已。
根據(jù)Spring Boot的文檔,配置使用的優(yōu)先級(jí)從高到低的順序毯盈,具體如下所示:
1. 命令行參數(shù)剃毒。
2. 通過 System.getProperties() 獲取的 Java 系統(tǒng)參數(shù)。
3. 操作系統(tǒng)環(huán)境變量搂赋。
4. 從 java:comp/env 得到的 JNDI 屬性赘阀。
5. 通過 RandomValuePropertySource 生成的“random.*”屬性。
6. 應(yīng)用 Jar 文件之外的屬性文件(application.properties)脑奠。
7. 應(yīng)用 Jar 文件內(nèi)部的屬性文件(application.properties)基公。
8. 在應(yīng)用配置 Java 類(包含“@Configuration”注解的 Java 類)中通過“@PropertySource”注解聲明的屬性文件。
9. 通過“SpringApplication.setDefaultProperties”聲明的默認(rèn)屬性宋欺。
這意味著轰豆,如果Spring Boot在優(yōu)先級(jí)更高的位置找到了配置,那么它就會(huì)無視低級(jí)的配置齿诞。
比如酸休,我在application.properties
目錄中,寫入本地的MySQL的配置:
db.jdbc.driver=com.mysql.jdbc.Driver
db.jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
db.jdbc.username=username
db.jdbc.password=password
在自己項(xiàng)目調(diào)試的階段祷杈,項(xiàng)目總是會(huì)使用本地的MySQL數(shù)據(jù)庫斑司。而一旦打包之后,在外部聲明一個(gè)test_evn.properties
.
啟動(dòng)Jar包的時(shí)候, 指定一個(gè)外部配置文件:
java -jar demo.jar --spring.config.location=/path/test_evn.properties
這樣一來但汞,我們?cè)陂_發(fā)者的機(jī)器上總是使用自己的配置陡厘,而一到對(duì)應(yīng)的環(huán)境,就會(huì)使用高級(jí)的位置所做的配置特占。
在代碼中讀取這些配置也是非常方便的糙置,在代碼的邏輯中,其實(shí)是無需去關(guān)心這個(gè)配置是從什么地方來的是目,只用關(guān)注能獲取什么配置就夠了谤饭。
public class ApplicationConfigure {
@Value("${db.jdbc.driver}")
private String jdbcDriver;
@Value("${db.jdbc.url}")
private String jdbcUrl;
@Value("${db.jdbc.username}")
private String jdbcUsername;
@Value("${db.jdbc.password}")
private String jdbcPassword;
// mysql config class
// .....
}
有時(shí)候我們?cè)陧?xiàng)目啟動(dòng)的時(shí)候,總是需要先啟動(dòng)一些初始化的類懊纳,以前比較常見的做法是寫再static
塊中揉抵,Spring Boot提供了一個(gè)CommandLineRunner
接口,實(shí)現(xiàn)這個(gè)接口的類總是會(huì)被優(yōu)先啟動(dòng)嗤疯,并優(yōu)先執(zhí)行CommandLineRunner
接口中提供的run()
方法冤今。
public class ApplicationConfigure implements CommandLineRunner {
@Value("${db.jdbc.driver}")
private String jdbcDriver;
@Value("${db.jdbc.url}")
private String jdbcUrl;
@Value("${db.jdbc.username}")
private String jdbcUsername;
@Value("${db.jdbc.password}")
private String jdbcPassword;
// mysql config class
// .....
@Override
public void run(String... strings) throws Exception {
// 預(yù)先加載的一些方法,類茂缚,屬性戏罢。
}
}
如果有多個(gè)CommandLineRunner
接口實(shí)現(xiàn)類屋谭,那么可以通過注解@Order
來規(guī)定所有實(shí)現(xiàn)類的運(yùn)行順序。
通過這一系列API的幫助龟糕,Spring Boot讓環(huán)境配置變得輕松很多桐磁。