原文连接: 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时,使用到的属性与本身但愿获得的属性值由差别时,从以上加载顺序中去查看相关属性内容。