Spring Boot 属性配置解析-灵析社区

cathoy

属性配置介绍

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中配置:

启动后打印的结果如下,已为最新值:

阅读量:2016

点赞量:0

收藏量:0