【SpringBoot 属性加载机制】

devtools/2024/10/18 12:22:47/

SpringBoot 属性加载

一个 SpringBoot 应用的配置属性可以有多种不同的来源, 比如可以来自操作系统的环境变量, 比如可以来自 application.yaml 文件; 每一种不同的属性来源, 都会被 SpringBoot 封装成一个PropertySource对象, 保存在 Environment 对象的 PropertySources 类型成员的 propertySourceList 中;
在这里插入图片描述
一个PropertySource对象中就通过一个 Map 保存了这个属性源下的所有属性配置;

例如application.yaml文件中的配置会被保存到一个OrginTrackedMapPropertySource对象中;
在这里插入图片描述
这些属性源在 List 中的顺序决定了他们的优先级;

因为无论是通过@Value注解还是 @ConfigurationProperties 注解去获取属性值, 其本质都是调用了 Environment::getProperty方法; 具体获取的过程下面会讲到;

而这个方法的逻辑是顺序遍历所有属性源, 在遍历到的属性源中尝试去获取指定的属性, 如果找到了就直接返回; 所以在propertySourceList中越靠前, 属性源的优先级就越高;

SpringApplicationrun 方法内, prepareContext 之前, 先调用prepareEnvironment方法, 准备应用环境,加载各种属性源, 包括系统变量,环境变量,命令行参数,默认变量, 配置文件等;

不了解SpringBoot启动过程看这篇文章 http://t.csdnimg.cn/qqs6G

在这里插入图片描述

属性源优先级

优先级从高到低

  1. Nacos 配置中心的配置;
  2. 当前应用的命名行参数;
  3. JAVA 的系统属性, 也就是来自JVM的启动时给的参数;
  4. 操作系统的环境变量;
  5. application-xxx.yaml, 例如 application-dev.yaml
  6. application.yaml
  7. boostrap.yaml
  8. @PropertySource 注解指定的配置文件;
  9. 默认属性

SpringBoot官网对优先级的描述:

Spring Boot uses a very particular order that is designed to allow sensible overriding of values. Later property sources can override the values defined in earlier ones. Sources are considered in the following order:PropertySource

  1. Default properties (specified by setting ).SpringApplication.setDefaultProperties
  2. @PropertySource annotations on your classes. Please note that such property sources are not added to the until the application context is being refreshed. This is too late to configure certain properties such as and which are read before refresh begins.
  3. Config data (such as files).application.properties
  4. A that has properties only in .RandomValuePropertySource``random.*
  5. OS environment variables.
  6. Java System properties ().System.getProperties()
  7. JNDI attributes from .java:comp/env
  8. ServletContext init parameters.
  9. ServletConfig init parameters.
  10. Properties from (inline JSON embedded in an environment variable or system property).SPRING_APPLICATION_JSON
  11. Command line arguments.
  12. properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.
  13. @TestPropertySource annotations on your tests.
  14. Devtools global settings properties in the directory when devtools is active.$HOME/.config/spring-boot

举例 : @Value 注解

my:addr: localhost:7770
java">@Value("${my.addr}")
String addr;

总结来说是通过 BeanPostProcessor, 在 Bean 实例化以后, 调用 Environment::getProperoty 获取属性值, 然后通过反射注入到 bean 中;

@Value 注解的详细分析参考这篇文章

@Autowired 与 @Value 作用原理详解


http://www.ppmy.cn/devtools/93948.html

相关文章

死信队列.

“死信”是指在RabbitMQ中那些因为某些原因无法被正常处理的消息。

从零开始实现循环神经网络

本节我们通过使用MXnet,来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后,即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示: 接…

C语言指针详解-包过系列(二)目录版

C语言指针详解-包过系列(二)目录版 1、数组名的深入理解1.1、数组名的本质1.2、数组名本质的两个例外1.2.1、sizeof(数组名)1.2.2、&数组名 2、使用指针访问数组3、一维数组传参本质4、二级指针4.1、二级指针介绍4.2、二级指针…

亿达科创亮相智造数字科技大会

8月8日,IMC2024第七届智造数字科技大会在京启幕。大会以“乘‘数’而上”为题,邀请300智能制造行业数字化转型技术大咖、领军者及实践者共聚一堂,解读智造行业转型进程。亿达科创受邀参会,分享企业前沿数字技术、解决方案与创新实…

零知识证明中PLONKish和AIR的区别

这里写自定义目录标题 介绍AIRPLONKish 介绍 首先我们讲一下什么是算数化,为什么零知识证明当中经常提到算术化。算术化是指将一个计算问题(通常是我想要证明的问题,非代数过程)转化为一组代数方程。使得这些问题可以用多项式计算…

智慧图书馆:构建高效视频智能管理方案,提升图书馆个性化服务

一、背景分析 随着信息技术的飞速发展,智慧图书馆作为现代公共文化服务的重要载体,正逐步从传统的纸质阅读空间向数字化、智能化方向转型。其中,视频智能管理方案作为智慧图书馆安全管理体系的重要组成部分,不仅能够有效提升图书…

记2024-08原生微信小程序开发

继2024.08 最近需要开发一个微信小程序的一个功能模块,但是之前在学的时候都是好几年前的东东了,然后重新快速过了一遍b站大学的教程,这篇文章就是基于教程进行的一些总结,和自己开发过程当中使用到的一些点和一些技巧什么的吧。 …

Kotlin 值类(Value Class)

在 Java 中,像 Integer、Double 等都是 包装类,都需要创建对象 装箱 数值。 很显然 创建对象是 消耗额外内存的,而 对于优化这种问题,Kotlin 引入了 value class,尽量避免装箱和脱箱。 一、声明语法 JvmInline value…