【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》

在这里插入图片描述

初识 ConfigurableEnvironment

  • 一、引言
  • 二、主要内容
    • 2.1 Environment
      • 2.1.1 配置文件(profiles)
      • 2.1.2 属性(properties)
    • 2.2 ConfigurablePropertyResolver
      • 2.2.1 属性类型转换配置
      • 2.2.2 占位符配置
      • 2.2.3 值分隔符配置
      • 2.2.4 必需属性验证配置
    • 2.3 ConfigurableEnvironment
      • 2.3.1 接口方法
      • 2.3.2 具体实现
  • 三、总结

一、引言

上篇博文,Huazie 带大家深入分析下 ApplicationArguments 接口及其默认实现。在初始化完 ApplicationArguments 之后,Spring Boot 就开始通过 prepareEnvironment 方法对 ConfigurableEnvironment 对象进行初始化操作。在介绍 ConfigurableEnvironment 的初始化之前,我们有必要先认识一下 ConfigurableEnvironment 接口。

在这里插入图片描述

二、主要内容

注意: 以下涉及 Spring Boot 源码 均来自版本 2.7.9,其他版本有所出入,可自行查看源码。

下面贴出 ConfigurableEnvironment 的源码:

public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {
	void setActiveProfiles(String... profiles);
	void addActiveProfile(String profile);
	void setDefaultProfiles(String... profiles);
	MutablePropertySources getPropertySources();
	Map<String, Object> getSystemProperties();
	Map<String, Object> getSystemEnvironment();
	void merge(ConfigurableEnvironment parent);
}

从上述源码,可以看出 ConfigurableEnvironment 接口继承了 EnvironmentConfigurablePropertyResolver 接口,它们其实最终都继承自 PropertyResolver 接口。

2.1 Environment

在这里插入图片描述

org.springframework.core.env.Environment 表示当前应用程序在其中运行的环境。它模拟了应用程序环境的两个关键方面:

2.1.1 配置文件(profiles)

Profile 是一个命名的、逻辑上的 bean 定义组,这些定义只有在给定的配置文件处于活动状态时才会被注册到容器中。通过 Environment 可以确定哪些配置文件(如果有)当前是活动的,以及哪些配置文件(如果有)应该默认是活动的。可以使用 @Profile 注解来指定 bean 应该在哪个配置文件下被注册。

2.1.2 属性(properties)

属性有各种来源,如属性文件JVM 系统属性系统环境变量JNDIservlet 上下文参数临时的 Properties 对象Map 等。Environment 对象为用户提供了一个方便的服务接口,用于配置属性源并从这些源中解析属性。通过 Environment,可以方便地访问和解析这些属性,而无需直接操作这些源。

此外,Environment 接口还继承了 PropertyResolver 接口【用于根据任何底层源解析属性的接口】,这意味着它还提供了与属性访问相关的功能。

2.2 ConfigurablePropertyResolver

在这里插入图片描述

org.springframework.core.env.ConfigurablePropertyResolver 也继承了 PropertyResolver 接口,并在其基础上增加了更多的配置选项:

2.2.1 属性类型转换配置

ConfigurablePropertyResolver 提供了基于 org.springframework.core.convert.ConversionService 的属性类型转换功能。ConversionServiceSpring 中用于类型转换的接口,它允许将一种类型的对象转换为另一种类型的对象。

与之关联的方法如下:

  • getConversionService() : 获取当前用于类型转换的 ConfigurableConversionService 实例。
  • setConversionService(ConfigurableConversionService conversionService): 设置用于类型转换的 ConfigurableConversionService 实例。这允许用户自定义类型转换的逻辑,以满足特定的应用程序需求。

2.2.2 占位符配置

ConfigurablePropertyResolver 允许开发者配置占位符的前缀和后缀。默认情况下,前缀是 ${,后缀是 }。占位符的值本身也可以包含其他占位符,形成嵌套占位符,ConfigurablePropertyResolver 支持嵌套占位符的解析。

与之相关的方法如下:

  • setPlaceholderPrefix(String placeholderPrefix) : 设置占位符的前缀。在解析属性时,这些前缀将被用来识别需要替换的占位符。
  • setPlaceholderSuffix(String placeholderSuffix) : 设置占位符的后缀。与前缀一起,它们定义了占位符的完整格式。
  • setIgnoreUnresolvableNestedPlaceholders(boolean ignoreUnresolvableNestedPlaceholders) : 设置是否忽略无法解析的嵌套占位符。如果设置为 true,则当遇到无法解析的嵌套占位符时,解析器将不会抛出异常,而是继续执行。

2.2.3 值分隔符配置

值分隔符是指在解析属性值时,用于分隔占位符与其关联默认值的字符设置。

比如,在配置文件中有这样的属性值:${propertyName:defaultValue}

在这里 propertyName 是占位符,而 defaultValue 是在 propertyName 无法解析时使用的默认值。那显然在上述示例中,: 就是 值分隔符

与之相关的方法如下:

  • setValueSeparator(@Nullable String valueSeparator) : 设置值分隔符。在某些情况下,属性值可能包含多个值,这些值由分隔符分隔。此方法允许用户指定分隔符。

2.2.4 必需属性验证配置

必需属性验证配置是 Spring 框架中用于确保应用程序配置中包含某些关键属性的一种机制。

与之相关的方法如下:

  • setRequiredProperties(String... requiredProperties): 设置必需的属性。这些属性必须在解析过程中存在,否则验证将失败。
  • validateRequiredProperties() throws MissingRequiredPropertiesException : 验证是否所有必需的属性都已设置。如果任何必需属性缺失,此方法将抛出 MissingRequiredPropertiesException 异常。

2.3 ConfigurableEnvironment

了解了 EnvironmentConfigurablePropertyResolver,我们再来看看 ConfigurableEnvironment

2.3.1 接口方法

ConfigurableEnvironment 代表了一个可配置的环境,其定义了如下的方法:

  • setActiveProfiles(String... profiles) :设置当前激活的 Profile 组集合。在Spring 中,Profile 允许用户根据特定的环境(如开发、测试、生产)加载不同的配置。通过传递一个或多个 Profile 名称作为参数,你可以激活这些 Profile
  • addActiveProfile(String profile) :向当前激活的 Profile 组集合中添加一个 Profile 组。
  • setDefaultProfiles(String... profiles) :设置默认激活的 Profile 组集合。激活的 Profile 组集合为空时,会默认实用默认的 Profile 组集合。
  • getPropertySources() :返回当前环境的 MutablePropertySources 对象。PropertySources 是一个包含多个 PropertySource 的列表,每个PropertySource 都可以提供属性。MutablePropertySources 允许你添加、替换或删除 PropertySource
  • getSystemProperties() :返回 Java 系统属性的映射。这些属性是 JVM 启动时通过 -D 参数或在代码中使用 System.setProperty(key, value) 进行设置。
  • getSystemEnvironment() :返回操作系统环境变量的映射。这些变量通常包含关于系统配置和运行时的信息。
  • merge(ConfigurableEnvironment parent) :将父 ConfigurableEnvironment 的属性源合并到当前环境中。合并时,父环境的属性源将添加到当前环境的属性源列表的开头,从而允许它们覆盖当前环境的任何同名属性。

2.3.2 具体实现

org.springframework.core.env.AbstractEnvironment 是一个抽象类,实现了 ConfigurableEnvironment 接口,为环境配置(如属性源和 Profile 文件管理)提供了基本的支持。

org.springframework.core.env.StandardEnvironment 继承自 AbstractEnvironment,应用于非 Web 环境。它是 Spring 中默认的环境配置类,负责读取系统属性、环境变量以及配置文件中的配置信息,并将其封装在一个 PropertySources 对象中供 Spring 应用程序使用。

org.springframework.web.context.support.StandardServletEnvironment 继承自 StandardEnvironment,它是基于 ServletWeb 应用程序要使用的 Environment 实现。所有基于 ServletWeb 相关的 ApplicationContext 类都会默认初始化一个实例。提供 ServletConfigServletContext 和基于 JNDIPropertySource 实例。在初始化过程中,会根据 ServletContextServletConfig 的可用性来初始化和配置属性源。通过 customizePropertySources() 方法,可以自定义属性源的添加顺序和配置方式。

org.springframework.mock.env.MockEnvironment 继承自 AbstractEnvironment,它用于测试目的,可以模拟环境变量和系统属性的值。

三、总结

本篇博文 Huazie 同大家一起了解了 ConfigurableEnvironment 接口和其父接口,这些对于后续理解 ConfigurableEnvironment 的初始化操作至关重要。接下来的博文将会继续聚焦 Spring Boot 启动运行阶段,敬请期待!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker容器技术、k8s的原理和常见命令、用k8s部署应用步骤

容器技术 容器借鉴了集装箱的概念&#xff0c;集装箱解决了什么问题呢&#xff1f;无论形状各异的货物&#xff0c;都可以装入集装箱&#xff0c;集装箱与集装箱之间不会互相影响。由于集装箱是标准化的&#xff0c;就可以把集装箱整齐摆放起来&#xff0c;装在一艘大船把他们…

C++基础(五):类和对象(上)

从今天开始&#xff0c;我们正式进入面向对象编程&#xff0c;这是C与C语言的重要区别&#xff0c;编程思想发生变化&#xff0c;那到底什么是面向对象编程呢&#xff1f;接下来&#xff0c;我们慢慢的深入学习。 目录 一、面向过程和面向对象初步认识 1.1 面向过程 1.2 面…

【Python】变量与基本数据类型

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言变量声明变量变量的命名规则 变量赋值多个变量赋值 标准数据类型变量的使用方式存储和访问数据&#xff1a;参与逻辑运算和数学运算在函数间传递数据构建复杂的数据结构 NameE…

腾讯混元文生图开源模型推出小显存版本,6G显存即可运行,并开源caption模型

7月4日&#xff0c;腾讯混元文生图大模型&#xff08;混元DiT&#xff09;宣布开源小显存版本&#xff0c;仅需6G显存即可运行&#xff0c;对使用个人电脑本地部署的开发者十分友好&#xff0c;该版本与LoRA、ControlNet等插件&#xff0c;都已适配至Diffusers库&#xff1b;并…

达梦数据库 页大小与数据库字段长度的关系

对于达梦数据库实例而言&#xff0c;页大小 (page_size)、簇大小 (extent_size)、大小写敏感 (case_sensitive)、字符集 (charset) 这四个参数&#xff0c;一旦确定无法修改&#xff1b;如果过程中发现这些数据设置的不对&#xff0c;只能是重新新建数据库实例&#xff0c;而不…

脑启发设计:人工智能的进化之路

编者按&#xff1a;你可以用左手&#xff08;不常用的那只手&#xff09;的小指与食指拿起一件物品么&#xff1f; 试完你是不是发现自己竟然可以毫不费力地用自己不常用的手中&#xff0c;两根使用频率相对较低的手指&#xff0c;做一个不常做的动作。这就是人类大脑不可思议…

14-5 小语言模型SLM 百科全书

想象一下这样一个世界&#xff1a;智能助手不再驻留在云端&#xff0c;而是驻留在你的手机上&#xff0c;无缝理解你的需求并以闪电般的速度做出响应。这不是科幻小说&#xff1b;这是小型语言模型 (SLM) 的前景&#xff0c;这是一个快速发展的领域&#xff0c;有可能改变我们与…

台灯学生用哪个牌子最好?学生用台灯品牌排行榜分析

台灯学生用哪个牌子最好&#xff1f;护眼台灯在近年来成为家长和长时间使用电子设备人群关注的家电/学生产品。对于家中有孩子或经常面对电子屏幕的人士来说&#xff0c;很多人可能已经对这类产品有所了解并进行了购买。然而&#xff0c;部分家长对护眼台灯的认识还不够深入&am…

windows安装jdk21

下载 下载zip解压 设置环境变量 设置JAVA_HOME环境变量 Path环境变量添加如下值%HAVA_HOME%\bin 打开新的cmd&#xff0c;输入java --version查看效果

CentralCache中心缓存

目录 一.CentralCache基本结构 1.CentralCache任务 2.基本结构 二.函数调用层次结构/.h文件 三.Span和SpanList的封装 Span:大块内存跨度 PAGE_ID _pageId size_t _objSize _useCount SpanList:管理Span的双链表(桶锁) 四.获取大块内存GetOneSpan 五.FetchRangeObj输…

源代码防泄漏之反向沙箱方案的经验分享

反向沙箱&#xff08;Reverse Sandbox&#xff09;是一种安全技术&#xff0c;主要用于检测和分析恶意软件的行为。与传统沙箱不同&#xff0c;反向沙箱的重点在于模拟恶意软件的预期运行环境&#xff0c;以诱导恶意软件展示其真实行为。这种技术可以帮助安全专家更深入地理解恶…

四川蔚澜时代电子商务有限公司打造抖音电商服务新高地

在数字化浪潮汹涌澎湃的今天&#xff0c;电商行业以其独特的魅力和强大的市场潜力&#xff0c;成为了推动经济增长的新引擎。四川蔚澜时代电子商务有限公司&#xff0c;作为这个领域的佼佼者&#xff0c;正以其专业的服务、创新的理念和卓越的实力&#xff0c;引领抖音电商服务…

【Linux进阶】Linux目录配置,FHS

在了解了每个文件的相关种类与属性&#xff0c;以及了解了如何修改文件属性与权限的相关信息后&#xff0c;再来要了解的就是&#xff0c;为什么每个Linux发行版它们的配置文件、执行文件、每个目录内放置的东西&#xff0c;其实都差不多&#xff1f;原来是有一套标准依据&…

在 Mac 上使用 MLX 微调微软 phi3 模型

微调大语言模型是常见的需求&#xff0c;由于模型参数量大&#xff0c;即使用 Lora/Qlora 进行微调也需要 GPU 显卡&#xff0c;Mac M系是苹果自己的 GPU&#xff0c;目前主流的框架还在建立在 CUDA 的显卡架构&#xff0c;也就是主要的卡还是来自英伟达。如果要用 Mac 来做训练…

pnpm的坑

请问pnpm的两个坑怎么解决&#xff1a; 第一个坑&#xff1a;没有节省磁盘空间 我已经配置了依赖的存储位置&#xff0c; 但我在项目里pnpm install以后&#xff0c;发现依赖包还是很大&#xff0c; 然后发现里面的链接并不是指向先前配置的依赖存储位置&#xff0c;而是指…

中霖教育怎么样?注册会计师可以跨省考试吗?

中霖教育怎么样?注册会计师可以跨省考试吗? 1. 考试地点安排&#xff1a; 注册会计师考试是在全国范围内统一举行的&#xff0c;通常设在各省、自治区和直辖市指定的考区。考生须依据准考证上提供的信息&#xff0c;核实自己的具体考试地点。该考试实行的网上统一报名制度&…

DBeaver连接clickhouse最全教程

环境 clickhouse server 20.3 dbeaver 24.1.1.202406231636在使用 dbeaver 连接 clickhouse 的时候需要&#xff0c;它默认是没有驱动的&#xff0c;然后其默认会安装 clickhouse-jdbc的 latest 版本&#xff0c;比如当前最新的驱动版本为 0.6.2&#xff0c;然后等我去连接的时…

LabVIEW汽车转向器测试系统

绍了一种基于LabVIEW的汽车转向器测试系统。该系统集成了数据采集、控制和分析功能&#xff0c;能够对转向器进行高效、准确的测试。通过LabVIEW平台&#xff0c;实现了对转向器性能参数的实时监测和分析&#xff0c;提升了测试效率和数据精度&#xff0c;为汽车转向器的研发和…

嵌入式Linux系统编程 — 6.6 信号掩码

目录 1 信号掩码介绍 2 sigprocmas函数 3 sigsuspend函数阻塞等待信号 1 信号掩码介绍 信号掩码&#xff08;Signal Mask&#xff09;是操作系统中用于控制进程接收信号的一种机制。每个进程都有一个或多个信号掩码&#xff0c;它们定义了哪些信号在特定时间被阻塞&#xf…

2024年在WordPress中创建销售活动的专家级优惠券方法

2024年在WordPress中创建销售活动的专家级优惠券方法 今天我想和大家分享一些关于如何在WordPress网站上使用专家级优惠券工具来创建销售活动的经验。对于已经在电商领域有一定经验的店主&#xff0c;利用专家级优惠券不仅能吸引顾客&#xff0c;还能显著增加销量。在这篇文章…