原文連接: www.jb51.net/article/146…java
原文介紹的足夠詳細spring
使用 Spring Boot 會涉及到各類各樣的配置,如開發、測試、線上就至少 3 套配置信息了。Spring Boot 能夠輕鬆的幫助咱們使用相同的代碼就能使開發、測試、線上環境使用不一樣的配置。json
先給你們介紹下spring boot 配置加載順序,具體內容以下所示:springboot
在 Spring Boot 裏面,可使用如下幾種方式來加載配置。本章內容基於 Spring Boot 2.0 進行詳解。app
咱們能夠在 Spring Beans 裏面直接使用這些配置文件中加載的值,如:dom
配置屬性的方式不少,Spring boot使用了一種獨有的 PropertySource 能夠很方便的覆蓋屬性的值。工具
配置屬性加載的順序以下:(下列順序1-17,對應優先級由高到低)單元測試
一、開發者工具
Devtools
全局配置參數;
二、單元測試上的@TestPropertySource
註解指定的參數;
三、單元測試上的@SpringBootTest
註解指定的參數;
四、命令行指定的參數,如java -jar springboot.jar --name="Java技術棧"
;
五、命令行中的SPRING_APPLICATION_JSONJSON
指定參數, 如java -Dspring.application.json='{"name":"Java技術棧"}' -jar springboot.jar
六、ServletConfig
初始化參數;
七、ServletContext
初始化參數;
八、JNDI參數(如java:comp/env/spring.application.json
);
九、Java系統參數(來源:System.getProperties()
);
十、操做系統環境變量參數;
十一、RandomValuePropertySource
隨機數,僅匹配:ramdom.*
;
十二、JAR包外面的配置文件參數(application-{profile}.properties(YAML)
)
1三、JAR包裏面的配置文件參數(application-{profile}.properties(YAML)
)
1四、JAR包外面的配置文件參數(application.properties(YAML)
)
1五、JAR包裏面的配置文件參數(application.properties(YAML)
)
1六、@Configuration
配置文件上@PropertySource
註解加載的參數;
1七、默認參數(經過SpringApplication.setDefaultProperties
指定);測試
在主應用程序中添加 Java 系統參數。spa
@Bean
public CommandLineRunner commandLineRunner() {
return (args) -> {
System.setProperty("name", "javastack-system-properties");
};
}
複製代碼
在 application.properties 文件中添加屬性。
name = javastack-application
複製代碼
在 application-dev.properties 文件中添加屬性。
name = javastack-application-dev
複製代碼
添加測試類
@RunWith(SpringRunner.class)
@SpringBootTest(value = { "name=javastack-test", "sex=1" })
@ActiveProfiles("dev")
public class SpringBootBestPracticeApplicationTests {
@Value("${name}")
private String name;
@Test
public void test() {
System.out.println("name is " + name);
}
}
複製代碼
運行 test 單元測試,程序輸出:
name is javastack-test
複製代碼
根據以上參數動態調整,發現參數會被正確被覆蓋。瞭解了 Spring Boot 各類配置的加載順序,若是配置被覆蓋了咱們就知道是什麼問題了。
優先級按照順序由高到低,數字越小優先級越高
1.在命令行中傳入的參數。相似於java -jar -Dspring.profiles.active之類。
2.SPRING_APPLICATION_JSON屬性,該屬性以JSON形式存儲在系統環境變量中。
3.java:comp/env中JNDI屬性。
4.Java的系統的屬性,可經過System.getProperties()得到相關內容。
5.操做系統中的環境變量。
6.經過random.*配置的隨機屬性。
7.位於當前應用jar包外,針對不一樣{profile}環境的配置文件內容。
8.位於當前應用jar包內,針對不一樣{profile}環境的配置文件內容。
9.位於當前應用jar包外的application.properties或application.yml配置內容。
10.位於當前應用jar包內的application.properties或application.yml配置內容。
11.在@Configuration註解修改的類中,經過@PropertySource註解定義的屬性。
12.應用默認屬性,使用SpringApplication.setDefaultProperties定義的屬性內容。
當發現本身使用springboot時,使用到的屬性與本身但願獲得的屬性值由差別時,從以上加載順序中去查看相關屬性內容。