spring boot参数配置之Environment源码分析

本文深入探讨了Spring Boot的参数配置,分析了Environment接口及其相关类的作用。首先介绍了PropertyResolver接口,它是属性访问的基础,包括ConfigurablePropertyResolver和Environment的层级结构。接着讨论了PropertySource接口,用于存储实际参数,如MapPropertySource、PropertiesPropertySource等实现。最后,详细解析了环境初始化的代码流程,从SpringApplication.run开始,涉及各种配置文件的加载顺序,并阐述了如何将Environment绑定到应用上下文。

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

在spring boot中所有参数都被理解为当前项目运行的环境变量。spring boot环境的初始化操作在ConfigurableApplicationContext的创建之前,功实现主要依赖PropertyResolverPropertySource这两个接口。

1. PropertyResolver接口

spring boot项目的非web项目会创建StandardEnvironment类并完成初始化参数的加载,web项目中则创建的为StandardServletEnvironment类来完成参数的初始化,其类层次关系如下
在这里插入图片描述

  • PropertyResolver:提供属性访问功能。
  • ConfigurablePropertyResolver :继承自PropertyResolver,额外主要提供属性类型转换(基于org.springframework.core.convert.ConversionService)功能。
  • Environment:继承自PropertyResolver,额外提供访问和判断profiles的功能。
  • ConfigurableEnvironment:继承自ConfigurablePropertyResolverEnvironment,并且提供设置激活的profile和默认的profile的功能。
  • ConfigurableWebEnvironment:继承自ConfigurableEnvironment,并且提供配置Servlet上下文和Servlet参数的功能。
  • AbstractEnvironment:实现了ConfigurableEnvironment接口,默认属性和存储容器的定义,并且实现了ConfigurableEnvironment种的方法,并且为子类预留可覆盖了扩展方法。
  • StandardEnvironment:继承自AbstractEnvironment,非Servlet(Web)环境下的标准Environment实现。
  • StandardServletEnvironment:继承自StandardEnvironment,Servlet(Web)环境下的标准Environment实现。

2. PropertySource接口

PropertySource为真实参数存储的地方,Environment的静态属性和存储容器都是在AbstractEnvironment中定义的,ConfigurableWebEnvironment接口提供的getPropertySources()方法可以获取到返回的MutablePropertySources实例,然后添加额外的PropertySource。实际上,Environment的存储容器就是org.springframework.core.env.PropertySource的子类集合,如下图:
PropertySource的常用类层次关系如下:
在这里插入图片描述

  • MapPropertySourcesource指定为Map实例的PropertySource实现。
  • PropertiesPropertySourcesource指定为Map实例的PropertySource实现,内部的Map实例由Properties实例转换而来。
  • ResourcePropertySource:继承自PropertiesPropertySourcesource指定为通过Resource实例转化为Properties再转换为Map实例。
  • StubPropertySourcePropertySource的一个内部类,source设置为null,实际上就是空实现。
  • OriginTrackedMapPropertySource:获取value值时,如果value为OriginTrackedValue,则调用value的getValue方法循环一直找到最原始的值

3. 环境初始化代码分析

  1. 从SpringApplication.run入手
public ConfigurableApplicationContext run(String... args) {
   
 …………
   try {
   
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(
            args);
      //Environment创建和初始化地方,在ApplicationContext创建之前
      ConfigurableEnvironment environment = prepa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值