属性配置介绍
Spring Boot 3.1.0 支持的属性配置方式与2.x版本没有什么变动,按照以下的顺序处理,后面的配置将覆盖前面的配置:
 1、SpringApplication.setDefaultProperties 指定的默认属性
 2、@PropertySource注解配置
 3、Jar包内部的application.properties 和 YAML 变量
 4、Jar包内部的application-{profile}.properties 和 YAML 变量
 5、Jar包外部的application.properties 和 YAML 变量
 6、Jar包外部的application-{profile}.properties 和 YAML 变量
 7、RandomValuePropertySource的随机值属性
 8、操作系统环境变量
 9、Java System属性 (System.getProperties())
 10、JNDI属性
 11、ServletContext 初始化参数
 12、ServletConfig 初始化参数
 13、嵌入在环境变量或系统属性中的SPRING_APPLICATION_JSON 的属性
 14、命令行参数
 15、测试环境properties 属性
 16、测试环境的@TestPropertySource 注解
 17、Devtools 全局配置
属性配置实验
使用前面的MyApplicationRunListener来读取Spring Boot 启动完成后的自定义配置,如下:
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("上下文已刷新,应用程序已启动,但尚未调用CommandLineRunners和ApplicationRunners");
        System.out.println(context.getEnvironment().getProperty("me"));
    }
 
默认属性
Properties properties = new Properties();
properties.setProperty("me", "123456");
springApplication.setDefaultProperties(properties);
springApplication.run(args);
 

@PropertySource注解配置
创建一个app.yml文件,放置于resource目录下:
me: 333333
 
在SpringBootDemoApplication中标注,@PropertySource("classpath:app.yml")
 
 运行后,此配置覆盖了“SpringApplication.setDefaultProperties 指定的默认属性”。
 基于 @PropertySource注解的配置,需要刷新上下文后才能读取,因此需要在刷新之前就加载的配置如 logging.* and spring.main.* ,不适用。
Jar包内部的application.properties 和 YAML 变量
在resources内部的application.yml中定义
me: 4444
 
运行后覆盖之前的配置值
 
Jar包内部的application-{profile}.properties 和 YAML 变量
在resources内部的application-test.yml中定义
me: 55555
 
并在application.yml中定义
spring:
  profiles:
    active:
      - test
 
运行后覆盖之前的配置值
 
Jar包外部的application.properties 和 YAML 变量
在jar包所在目录,创建一个application.yml文件:
me: 666666
 
运行后覆盖之前的配置值
 
Jar包外部的application-{profile}.properties 和 YAML 变量
在jar 所在目录,创建一个application-test.yml文件:
me: 777777
 
运行后覆盖之前的配置值
 
RandomValuePropertySource的随机值属性
RandomValuePropertySource 会解析random.*开头的属性,返回一个随机值,如${random.int}返回一个随机整数
 同样在前面的application-test.yml文件中配置:
me: ${random.int}
 
启动后,打印一个随机整数
 
操作系统环境变量
在操作系统中配置一个me变量,值为888888,启动后,即可读取到me的环境变量:
 
Java System属性 (System.getProperties())
在这里,我们不再往JVM中设置新的属性,而是读取其原有的属性,如java.version
 在MyApplicationRunListener中,输出java.version
@Override
public void started(ConfigurableApplicationContext context, Duration timeTaken) {
    System.out.println("上下文已刷新,应用程序已启动,但尚未调用CommandLineRunners和ApplicationRunners");
    System.out.println(context.getEnvironment().getProperty("me"));
    System.out.println(context.getEnvironment().getProperty("java.version"));
}
 
为了能够体现后面的配置覆盖前面的配置,在application-test.yml中手动配置java.version
java:
  version: 1.8
 
运行后,打印的结果:
 
JNDI属性
这块用的很少,就忽略了,如果是同样的配置,该配置会覆盖前面的配置。
ServletContext 初始化参数
ServletConfig 初始化参数
如上两个都是servlet的配置,如server.port
嵌入在环境变量或系统属性中的SPRING_APPLICATION_JSON 的属性
在IDEA中配置启动时候的环境变量,SPRING_APPLICATION_JSON是一个JSON格式,如:
 
 启动后,将打印:
 
命令行参数
同样的在IDEA中配置命令行参数,--me=10000
 
 启动后打印结果如下,覆盖以前配置的值:
 
测试环境properties 属性
该配置是在单元测试中使用,如:
@SpringBootTest(properties = {"me=2000"})
class GatewayApplicationTests {
	@Autowired
	private Environment environment;
	@Test
	void contextLoads() {
		System.out.println(environment.getProperty("me"));
	}
}
 
启动后,将打印2000
测试环境的@TestPropertySource 注解
该配置是在单元测试中使用,如:
@TestPropertySource(properties = {"me=3000"})
@SpringBootTest(properties = {"me=2000"})
class SpringBootDemoTests {
	@Autowired
	private Environment environment;
	@Test
	void contextLoads() {
		System.out.println(environment.getProperty("me"));
	}
}
 
启动后打印3000
 
Devtools 全局配置
Devtools 是Spring Boot 提供的一套开发工具,启用需要依赖如下依赖:
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
</dependency>
 
默认读取$HOME/.config/spring-boot目录下的spring-boot-devtools.properties、spring-boot-devtools.yaml、spring-boot-devtools.yml文件,如果不存在,会从 $HOME 目录的根目录中搜索是否存在 .spring-bootdevtools.properties
 如在.spring-bootdevtools.properties中配置:
 
 启动后打印的结果如下,已为最新值:











