【Spring Boot 源码学习】初识 ConfigurableEnvironment

news2024/12/23 18:35:50

《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 启动运行阶段,敬请期待!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单调栈(左小大,右小大)

①寻找每个数左边第一个比它小的数 给定一个长度为 N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 −1。 输入样例&#xff1a; 3 4 2 7 5 输出样例&#xff1a; -1 3 -1 2 2 从左到右遍历&#xff0c;用单调递增&#xff08;栈底到栈顶…

Spring MVC 中 使用 RESTFul 实现用户管理系统

1. Spring MVC 中 使用 RESTFul 实现用户管理系统 文章目录 1. Spring MVC 中 使用 RESTFul 实现用户管理系统2. 静态页面准备2.1 user.css2.2 user_index.html2.3 user_list.html2.4 user_add.html2.5 user_edit.html 3. SpringMVC环境搭建3.1 创建module&#xff1a;usermgt3…

操作审计(一)

操作审计&#xff08;一&#xff09; 前言一、快速查询事件二、高级查询事件总结 前言 这里主要记录操作审计的过程&#xff0c;操作审计其实就是监控并记录阿里云账号的活动&#xff0c;可以使用阿里云的操作审计服务来审计最近90天阿里云账号下的操作&#xff0c;从而确保云…

纯正刊!IF不降反升,国人通过率高>98%,29天录用!无“爆雷”风险

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;来稿即录25天&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;纯正刊29天录用&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&a…

PhpStorm 2024 for Mac PHP集成开发工具

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

sql查询练习

1.表的结构 课程表&#xff1a;课程编号cid&#xff0c;课程名称canme&#xff0c;老师tid&#xff0c; 教师表&#xff1a;教师tid&#xff0c;教师姓名tname 分数表&#xff1a;学生student_sid&#xff0c;课程 cours_id&#xff0c;&#xff0c;分数score 学生表&#xff…

谷粒商城-个人笔记(集群部署篇二)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【SSL 1823】消灭怪物(非传统BFS)

题目大意 小b现在玩一个极其无聊的游戏&#xff0c;它控制角色从基地出发&#xff0c;一路狂奔夺走了对方的水晶&#xff0c;可是正准备回城时&#xff0c;发现地图上已经生成了 n n n 个怪。 现在假设地图是二维平面&#xff0c;所有的怪和角色都认为是在这个二维平面的点上…

鸿翼夯实统一AI基础设施,加速大模型落地释放AI“模”力!

从“百模大战”到“千模大战”&#xff0c;全球通用大模型数量快速增加&#xff0c;将大模型融入企业&#xff0c;建立企业自身的AI基础设施&#xff0c;打造行业或特定领域、任务的专用大模型&#xff0c;助力生产力革新和产业升级&#xff0c;已经成为目前企业关注的核心。 大…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

文章目录 什么是 AOP &#xff1f;.Net Core 中 有哪些 AOP 框架&#xff1f;基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP &#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&a…

实验二 图像的代数运算

一、实验目的&#xff1a; 1&#xff0e;了解图像的算术运算在数字图像处理中的初步应用。 2&#xff0e;体会图像算术运算处理的过程和处理前后图像的变化。 二、实验内容&#xff1a; 1&#xff0e;图像的加法运算 图像相加一般用于对同一场景的多幅图像求平均效果&…

c语言回顾-内存操作函数

目录 前言 1.memcpy 函数 1.1函数介绍 1.2与strcpy的区别 1.3memcpy的模拟 2.memmove 函数 2.1函数介绍和使用 2.2函数的模拟 3.memset函数 3.1函数介绍 3.2函数的模拟 4.memcmp函数 4.1函数的使用 4.2函数的模拟 结束语 前言 在动态内存的章节中小编详细讲解了动…

pandas数据分析(7)

组合DataFrame 连接 如果只是要将多个DataFrame粘合在一起&#xff0c;那么concat函数是最佳选择。在默认情况下&#xff0c;concat会将DataFrame按行粘合在一起&#xff0c;同时会将各列自动对齐。 如果想要按列进行粘合&#xff0c;需要将axis设置为1&#xff1a; concat的特…

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比&#xff0c;同时还可以兼容ubuntu、安卓等多种操作系统&#xff0c;今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

【Git 学习笔记】gitk 命令与 git log 其他参数的使用

1.7 用 gitk 查看提交历史 # make sure you have gitk installed $ which gitk /usr/bin/gitk # Sync the commit ID $ git checkout master && git reset --hard 13dcad # bring up the gitk interface, --all to see everything $ gitk --all &实测结果&#xf…

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数&#xff08;m_track&#xff09;、绘…

网络数据传输中的封装与解封装详解

注&#xff1a;机翻&#xff0c;未校对。 The goal of networks is to transmit data from one host to another. 网络的目标是将数据从一个主机传输到另一个主机。 Encapsulation 封装 To achieve this goal, each layer adds its own header to the data. A header contain…

2024年7月5日 十二生肖 今日运势

小运播报&#xff1a;2024年7月5日&#xff0c;星期五&#xff0c;农历五月三十 &#xff08;甲辰年庚午月庚午日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;狗、羊、虎 需要注意&#xff1a;鸡、牛、鼠 喜神方位&#xff1a;西北方 财神方位&#xff1a;正…

深圳合规新动向,这个关键环节要做好

随着全球商业环境的日益复杂化&#xff0c;企业合规管理已成为维护公司稳健运营和市场竞争力的核心要素。特别是对于位于创新前沿的深圳市&#xff0c;有效的合规管理系统不仅是满足法律和监管要求的必须&#xff0c;更是企业可持续发展的关键。 深圳市在全国率先探索并成功实…

#数据结构 笔记三

二叉树 1. 概念 二叉树Binary Tree是n个结点的有限集合。它或者是空集n0&#xff0c;或者是由一个根结点以及两颗互不相交、分别称为左子树和右子树的二叉树组成。 二叉树与普通有序树不同&#xff0c;二叉树严格区分左子和右子&#xff0c;即使只有一个子结点也要区分左右。…