Spring Boot 属性配置解析

2023-10-16 11:21:03 浏览数 (1)

基于Spring Boot 3.1.0 系列文章

  1. Spring Boot 源码阅读初始化环境搭建
  2. Spring Boot 框架整体启动流程详解
  3. Spring Boot 系统初始化器详解
  4. Spring Boot 监听器详解
  5. Spring Boot banner详解

属性配置介绍

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 启动完成后的自定义配置,如下:

代码语言:javascript复制
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("上下文已刷新,应用程序已启动,但尚未调用CommandLineRunners和ApplicationRunners");
        System.out.println(context.getEnvironment().getProperty("me"));
    }

默认属性

代码语言:javascript复制
Properties properties = new Properties();
properties.setProperty("me", "123456");
springApplication.setDefaultProperties(properties);
springApplication.run(args);

@PropertySource注解配置

创建一个app.yml文件,放置于resource目录下:

代码语言:javascript复制
me: 333333

在SpringBootDemoApplication中标注,@PropertySource("classpath:app.yml")

运行后,此配置覆盖了“SpringApplication.setDefaultProperties 指定的默认属性”。

基于 @PropertySource注解的配置,需要刷新上下文后才能读取,因此需要在刷新之前就加载的配置如 logging.* and spring.main.* ,不适用。

Jar包内部的application.properties 和 YAML 变量

在resources内部的application.yml中定义

代码语言:javascript复制
me: 4444

运行后覆盖之前的配置值

Jar包内部的application-{profile}.properties 和 YAML 变量

在resources内部的application-test.yml中定义

代码语言:javascript复制
me: 55555

并在application.yml中定义

代码语言:javascript复制
spring:
  profiles:
    active:
      - test

运行后覆盖之前的配置值

Jar包外部的application.properties 和 YAML 变量

在jar包所在目录,创建一个application.yml文件:

代码语言:javascript复制
me: 666666

运行后覆盖之前的配置值

Jar包外部的application-{profile}.properties 和 YAML 变量

在jar 所在目录,创建一个application-test.yml文件:

代码语言:javascript复制
me: 777777

运行后覆盖之前的配置值

RandomValuePropertySource的随机值属性

RandomValuePropertySource 会解析random.*开头的属性,返回一个随机值,如${random.int}返回一个随机整数

同样在前面的application-test.yml文件中配置:

代码语言:javascript复制
me: ${random.int}

启动后,打印一个随机整数

操作系统环境变量

在操作系统中配置一个me变量,值为888888,启动后,即可读取到me的环境变量:

注意:操作系统环境变量要全局生效,否则会读取不到

Java System属性 (System.getProperties())

在这里,我们不再往JVM中设置新的属性,而是读取其原有的属性,如java.version

MyApplicationRunListener中,输出java.version

代码语言:javascript复制
@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

代码语言:javascript复制
java:
  version: 1.8

运行后,打印的结果:

JNDI属性

这块用的很少,就忽略了,如果是同样的配置,该配置会覆盖前面的配置。

ServletContext 初始化参数

ServletConfig 初始化参数

如上两个都是servlet的配置,如server.port

嵌入在环境变量或系统属性中的SPRING_APPLICATION_JSON 的属性

在IDEA中配置启动时候的环境变量,SPRING_APPLICATION_JSON是一个JSON格式,如:

启动后,将打印:

命令行参数

同样的在IDEA中配置命令行参数,--me=10000

启动后打印结果如下,覆盖以前配置的值:

测试环境properties 属性

该配置是在单元测试中使用,如:

代码语言:javascript复制
@SpringBootTest(properties = {"me=2000"})
class GatewayApplicationTests {

	@Autowired
	private Environment environment;

	@Test
	void contextLoads() {
		System.out.println(environment.getProperty("me"));
	}

}

启动后,将打印2000

测试环境的@TestPropertySource 注解

该配置是在单元测试中使用,如:

代码语言:javascript复制
@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 提供的一套开发工具,启用需要依赖如下依赖:

代码语言:javascript复制
<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中配置: 启动后打印的结果如下,已为最新值:


作者其他要推荐的文章,欢迎来学习: Prometheus 系列文章

  1. Prometheus 的介绍和安装
  2. 直观感受PromQL及其数据类型
  3. PromQL之选择器和运算符
  4. PromQL之函数
  5. Prometheus 告警机制介绍及命令解读
  6. Prometheus 告警模块配置深度解析
  7. Prometheus 配置身份认证
  8. Prometheus 动态拉取监控服务
  9. Prometheus 监控云Mysql和自建Mysql

Grafana 系列文章,版本:OOS v9.3.1

  1. Grafana 的介绍和安装
  2. Grafana监控大屏配置参数介绍(一)
  3. Grafana监控大屏配置参数介绍(二)
  4. Grafana监控大屏可视化图表
  5. Grafana 查询数据和转换数据
  6. Grafana 告警模块介绍
  7. Grafana 告警接入飞书通知

Spring Boot Admin 系列

  1. Spring Boot Admin 参考指南
  2. SpringBoot Admin服务离线、不显示健康信息的问题
  3. Spring Boot Admin2 @EnableAdminServer的加载
  4. Spring Boot Admin2 AdminServerAutoConfiguration详解
  5. Spring Boot Admin2 实例状态监控详解
  6. Spring Boot Admin2 自定义JVM监控通知
  7. Spring Boot Admin2 自定义异常监控
  8. Spring Boot Admin 监控指标接入Grafana可视化

0 人点赞