Spring Boot 属性配置解析

news/2024/7/24 5:04:13 标签: spring boot, java, spring

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

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

默认属性

java">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

java">@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 属性

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

java">@SpringBootTest(properties = {"me=2000"})
class GatewayApplicationTests {

	@Autowired
	private Environment environment;

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

}

启动后,将打印2000

测试环境的@TestPropertySource 注解

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

java">@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 系列文章

  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可视化

http://www.niftyadmin.cn/n/429937.html

相关文章

浮点数在内存中的运算

他们力量的源泉&#xff0c;是值得信赖的搭档以及想要保护的对象还有强大的敌人 本文收录于青花雾气-计算机基础 往期回顾 从汇编代码探究函数栈帧的创建和销毁的底层原理 从0到1搞定在线OJ 数据在内存中的存储 计算机存储的大小端模式 目录 浮点数的二进制转化及存储规…

深度相机、实验箱、扫描仪、机器狗…… 奥比中光超强性能3D视觉应用亮相VALSE 2023

导读 6月10日-12日&#xff0c;VALSE 2023视觉与学习青年学者研讨会在江苏无锡举办&#xff0c;奥比中光作为金牌赞助商&#xff0c;携Femto Mega与Gemini 2系列3D相机以及3D视觉实验箱开发套件、手持3D扫描仪、四足机器狗等创新解决方案参展&#xff0c;为3D视觉开发者提供多…

Go语言小细节

Go语言小细节 结构体 结构体中允许存在匿名字段&#xff0c;即只有类型没有具体的变量名&#xff0c;但是一个结构体内只允许有一个相同类型的结构体中字段大写开头表示可公开访问&#xff0c;小写表示私有&#xff08;仅在当前结构体的包中可访问&#xff09;在编写结构体的…

从零开始 Spring Boot 39:循环依赖

从零开始 Spring Boot 39&#xff1a;循环依赖 图源&#xff1a;简书 (jianshu.com) 什么是循环依赖 我们看一个例子&#xff1a; Component public class Person {private Dog pet;public Person(Dog pet) {this.pet pet;} }Component public class Dog {private Person o…

嵌入式软件实现定时器的两种方式

简介 在一般的嵌入式产品设计中&#xff0c;介于成本、功耗等&#xff0c;所选型的MCU基本都是资源受限的&#xff0c;而里面的定时器的数量更是有限。在我们软件设计中往往有多种定时需求&#xff0c;例如脉冲输出、按键检测、LCD切屏延时等等 &#xff0c;我们不可能让每一个…

MySQL数据库常用命令

mysql是不见 分号 不执行&#xff0c;分号表示结束。\c可以终止命令的输入。 1.登录数据库 mysql -u root -p然后在输入密码 root 2.查看数据库(以分号结尾) show databases; 3.创建数据库 pk create database pk; 4.使用数据库pk use pk; 5.删除数据库pk drop database…

46 最佳实践-性能最佳实践-内存大页

文章目录 46 最佳实践-性能最佳实践-内存大页46.1 概述46.2 操作指导 46 最佳实践-性能最佳实践-内存大页 46.1 概述 相比传统的4K内存分页&#xff0c;openEuler也支持2MB/1GB的大内存分页。内存大页可以有效减少TLB miss&#xff0c;显著提升内存访问密集型业务的性能。ope…

【算法】Fisher-Yates 洗牌算法

Fisher-Yates 洗牌算法代码如下&#xff1a; const cpData [a, b, c, d] for (var i cpData.length - 1; i > 0; i--) {var j Math.floor(Math.random() * (i 1));var temp cpData[i];cpData[i] cpData[j];cpData[j] temp; }对于代码的解释 Math.random() * (i 1) 是…