SpringBoot应用环境分析StandardEnvironment

本文深入分析了Spring Boot中StandardEnvironment的作用及其如何获取和设置应用的属性与环境变量,介绍了属性来源及存储机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 源码分析

Intellij idea Diagrams

 上图看不懂,重画一张如下:

 经上分析,得知 StandardEnvironment 主要功能用于获取和设置应用程序的属性和环境。

2. 得到下列问题:

  1. 属性是什么?
  2. 环境是什么?
  3. 属性和环境从那儿来,到那儿去?

属性 和 环境 是什么,阅读 StandardEnvironment 和 AbstractEnvironment 得到答案。

StandardEnvironment.java 第77行

@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
    propertySources.addLast(new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
    propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}

getSystemProperties() 此方法获取属性。

AbstractEnvironment.java 第387行

public Map<String, Object> getSystemProperties() {
		try {
			return (Map) System.getProperties();
		}
        // 其他省略...
}

直接调用 System.getProperties(); 方法获取java系统属性返回。

System.getProperties(); 打印如下:

getSystemEnvironment() 此方法获取环境。

AbstractEnvironment.java 第413行

public Map<String, Object> getSystemEnvironment() {
		if (suppressGetenvAccess()) {
			return Collections.emptyMap();
		}
		try {
			return (Map) System.getenv();
		}
        其他省略...
}

先检查 SpringProperties 是否存在 spring.getenv.ignore 环境变量,如果不存在则则查询 System.getProperties(); 是否存在。如果值为true则返回空的Map对象EmptyMap,如果存在则获取系统环境System.getenv()返回。

System.getenv() 打印如下:

 实际测试一次,确实没有获取到 Java 环境给出空Map作为返回

问题解答完成,下一个。

属性和环境放在那儿了?在这里得到答案。

StandardEnvironment.java 第77行

@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
    propertySources.addLast(new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
    propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}

可以看到 MutablePropertySources.addLast(); 方法,为啥将 属性 和 环境 丢进去。

实现了迭代接口,拥有了存储数据功能。

MutablePropertySources.java 第44行

MutablePropertySources implements PropertySources {

	private final List<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>();
    省略代码...
}

 内部使用了一个 CopyOnWriterArrayList 用来存放数据。

数据结构为:

MutablePropertySources.java 第44行集合

[
    PropertiesPropertySource: PropertySource {
        name: '属性名',
        source: {
            key1: value1,
            key2: value2
        }
    }
]

至此存放集合分析完成。

结合 ConfigurableConversionService,MutablePropertySources 前者做数据转换,后者做数据存储。

PropertySourcesPropertyResolver 负责类型转换:将读取到的 时间,整数,浮点等一些基础数据进行数据转换。

简单给个使用案例:

 功能特点:

1.查询数据按照数组顺序查询,若有重复的取第一个

2.数据取出时会自动转换为指定类型,默认String 类型

SpringBoot转换服务ApplicationConversionService

至此完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值