基于Spring Boot 3.1.0 系列文章
- Spring Boot 源码阅读初始化环境搭建
- Spring Boot 框架整体启动流程详解
- Spring Boot 系统初始化器详解
- Spring Boot 监听器详解
- 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 启动完成后的自定义配置,如下:
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
中配置:
启动后打印的结果如下,已为最新值:
作者其他要推荐的文章,欢迎来学习:
Prometheus 系列文章
- Prometheus 的介绍和安装
- 直观感受PromQL及其数据类型
- PromQL之选择器和运算符
- PromQL之函数
- Prometheus 告警机制介绍及命令解读
- Prometheus 告警模块配置深度解析
- Prometheus 配置身份认证
- Prometheus 动态拉取监控服务
- Prometheus 监控云Mysql和自建Mysql
Grafana 系列文章,版本:OOS v9.3.1
- Grafana 的介绍和安装
- Grafana监控大屏配置参数介绍(一)
- Grafana监控大屏配置参数介绍(二)
- Grafana监控大屏可视化图表
- Grafana 查询数据和转换数据
- Grafana 告警模块介绍
- Grafana 告警接入飞书通知
Spring Boot Admin 系列
- Spring Boot Admin 参考指南
- SpringBoot Admin服务离线、不显示健康信息的问题
- Spring Boot Admin2 @EnableAdminServer的加载
- Spring Boot Admin2 AdminServerAutoConfiguration详解
- Spring Boot Admin2 实例状态监控详解
- Spring Boot Admin2 自定义JVM监控通知
- Spring Boot Admin2 自定义异常监控
- Spring Boot Admin 监控指标接入Grafana可视化