通常在一個項目中,老是會有好多個環境。好比:java
開發環境 -> 測試環境 -> 預發佈環境 -> 生產環境mysql
每一個環境上的配置文件老是不同的,甚至開發環境中每一個開發者的環境可能也會有一點不一樣,配置讀取但是一個讓人有點傷腦筋的問題。spring
Spring Boot提供了一種優先級配置讀取的機制來幫助咱們從這種困境中走出來。sql
常規狀況下,咱們都知道Spring Boot的配置會從application.properties
中讀取。實際上,從resource
目錄下的application.properties
文件讀取是Spring Boot配置鏈中的一環而已。數據庫
根據Spring Boot的文檔,配置使用的優先級從高到低的順序,具體以下所示:app
1. 命令行參數。 2. 經過 System.getProperties() 獲取的 Java 系統參數。 3. 操做系統環境變量。 4. 從 java:comp/env 獲得的 JNDI 屬性。 5. 經過 RandomValuePropertySource 生成的「random.*」屬性。 6. 應用 Jar 文件以外的屬性文件(application.properties)。 7. 應用 Jar 文件內部的屬性文件(application.properties)。 8. 在應用配置 Java 類(包含「@Configuration」註解的 Java 類)中經過「@PropertySource」註解聲明的屬性文件。 9. 經過「SpringApplication.setDefaultProperties」聲明的默認屬性。
這意味着,若是Spring Boot在優先級更高的位置找到了配置,那麼它就會無視低級的配置。dom
好比,我在application.properties
目錄中,寫入本地的MySQL的配置:ide
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
在本身項目調試的階段,項目老是會使用本地的MySQL數據庫。而一旦打包以後,在外部聲明一個test_evn.properties
.測試
啓動Jar包的時候, 指定一個外部配置文件:url
java -jar demo.jar --spring.config.location=/path/test_evn.properties
這樣一來,咱們在開發者的機器上老是使用本身的配置,而一到對應的環境,就會使用高級的位置所作的配置。
在代碼中讀取這些配置也是很是方便的,在代碼的邏輯中,實際上是無需去關心這個配置是從什麼地方來的,只用關注能獲取什麼配置就夠了。
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 // ..... }
有時候咱們在項目啓動的時候,老是須要先啓動一些初始化的類,之前比較常見的作法是寫再static
塊中,Spring Boot提供了一個CommandLineRunner
接口,實現這個接口的類老是會被優先啓動,並優先執行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 { // 預先加載的一些方法,類,屬性。 } }
若是有多個CommandLineRunner
接口實現類,那麼能夠經過註解@Order
來規定全部實現類的運行順序。
經過這一系列API的幫助,Spring Boot讓環境配置變得輕鬆不少。