【Java】【系列篇】【Spring源码解析】【三】【体系】【Environment体系】

news2024/10/6 4:05:06

整体结构图

image-20230116104132426

本篇文章仅作简单了解,详细还等到Springboot系列里面详解

PropertyResolver

作用

用于针对任何基础源解析属性(Property)的接口

方法解析

// 查看规定指定的key是否有对应的value 对应key的值是null的话也算是不能解析
boolean containsProperty(String key);
// 返回指定key对应的value,如果没有则返回null
@Nullable
String getProperty(String key);
// 返回指定key对应的value,如果没有则返回defaultValue
String getProperty(String key, String defaultValue);
// 返回指定key对应的value,会解析成指定类型。如果没有对应值则返回null
@Nullable
<T> T getProperty(String key, Class<T> targetType);
// 返回指定key对应的value,会解析成指定类型。如果没有对应值则返回defaultValue
<T> T getProperty(String key, Class<T> targetType, T defaultValue);
// 转换指定key对应的value为指定类型。如果没有直接抛异常,所以不用担心返回值是null
String getRequiredProperty(String key) throws IllegalStateException;
// 返回指定key对应的value为指定类型。如果没有直接抛异常,所以不用担心返回值是null
<T> T getRequiredProperty(String key, Class<T> targetType) throws IllegalStateException;
// 解析${...}这种类型的占位符,把他们替换为使用getProperty方法返回的结果,解析不了并且没有默认值的占位符会被忽略
String resolvePlaceholders(String text);
// 解析${...}这种类型的占位符,把他们替换为使用getProperty方法返回的结果,解析不了并且没有默认值的占位符会抛异常
String resolveRequiredPlaceholders(String text) throws IllegalArgumentException;

ConfigurablePropertyResolver

作用

在PropertyResolver的基础之上增加了值转换功能。提供访问和自定义将属性值从一种类型转换为另一种类型时使用的ConversionService的工具。

方法解析

// 返回在解析属性时使用的ConfigurableConversionService。此方法的返回值可被用户定制化,例如可以移除或者添加Converter
ConfigurableConversionService getConversionService();
// 设置在涉及到属性转换操作时所使用到的ConfigurableConversionService。全部替换ConfigurableConversionService的操作不常用,
// 更常用的一种方法是使用getConversionService
void setConversionService(ConfigurableConversionService conversionService);
// 设置被此解析器替换的占位符必须以其开头的前缀/后缀  默认是${}
void setPlaceholderPrefix(String placeholderPrefix);
void setPlaceholderSuffix(String placeholderSuffix);
// 指定此解析器所替换的占位符与其关联的默认值之间的分隔字符,如果不应将此类特殊字符作为值分隔符处理,则为null。默认值的分隔符   默认为冒号:
void setValueSeparator(@Nullable String valueSeparator);
// 设置当遇到嵌套在给定属性值内的不可解析占位符时是否抛出异常。false表示严格解析,即抛出异常。true表示不可解析的嵌套占位符应该在其未解析的${…}形式
void setIgnoreUnresolvableNestedPlaceholders(boolean ignoreUnresolvableNestedPlaceholders);
// 指定必须出现的属性,以便由validateRequiredProperties()验证
void setRequiredProperties(String... requiredProperties);
// 验证setRequiredProperties指定的每个属性是否存在,并解析为一个非空值。
void validateRequiredProperties() throws MissingRequiredPropertiesException;

AbstractPropertyResolver

解析

实现类,基本实现了上面接口的所有方法,当然也提供一个抽象方法给子类去实现

image-20230116120321704

PropertySourcesPropertyResolver

解析

Spring框架将某个属性源抽象成了类PropertySource,又将多个属性源PropertySource组合抽象为接口PropertySources。对某个PropertySource对象中属性的解析,抽象成了接口PropertyResolver,而类PropertySourcesPropertyResolver则是Spring用于解析一个PropertySources对象中属性的工具类。

image-20230116134329142

Environment

JavaDoc

Environment是表示当前应用程序正在其中运行的环境的接口,它为应用环境制定了两个关键的方面:profile和properties,与属性访问有关的方法通过
PropertyResolver这个父接口公开(其中,PropertyResolver这个接口主要负责解析占位符对应的值);profile机制保证了仅在给定profile处于激活状态(active)
时才向容器注册的BeanDefinitiion的命名逻辑组;无论是用XML定义还是通过注解定义,都可以将Bean分配给指定的profile;与配置文件相关的Environment的作用是决定
当前哪些配置文件处于激活状态,以及默认情况下哪些配置文件应处于激活状态(即Environment配合profile可以完成指定模式的环境的组件装配,以及不同的配置属性注
入);Properties在几乎所有应用程序中都起着重要作用,并且可能源自多种来源:属性文件,JVM 系统属性,系统环境变量,JNDI,ServletContext参数,临时属性对象,
Map对象等;Environment与属性相关联的作用是为用户提供方便的接口,它可以用于配置属性源,并从Environment中解析属性;
Environment中存放了很多properties,properties的来源有很多种,而properties最终的作用都是提供属性配置,或为组件注入属性值;
在ApplicationContext中管理的Bean可以注册为EnvironmentAware或使用@Inject标注在Environment上,以便直接查询profile的状态或解析Properties; 
但是,在大多数情况下,应用程序级 Bean不必直接与Environment交互,而是通过将${...} 属性值替换为属性占位符配置器进行属性注入
(例如PropertySourcesPlaceholderConfigurer),该属性本身是EnvironmentAware,当配置了<context:property-placeholder/>时,
默认情况下会使用Spring 3.1的规范注册;
    Spring 3.1前占位符处理
        组件:org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
    Spring 3.1+占位符处理
        组件:org.springframework.context.support.PropertySourcesPlaceholderConfigurer
Environment可以注入到组件中,用于获取当前环境激活的所有profile环境,但不推荐开发者直接使用它,而是通过占位符${...}注入属性的值;
Environment必须通过从所有AbstractApplicationContext子类的getEnvironment()方法返回的ConfigurableEnvironment接口完成环境对象的配置;
ConfigurableEnvironment具有可写属性的,可以修改Spring容器内部的属性值 / 数据;

方法解析

String[] getActiveProfiles();

String[] getDefaultProfiles();

@Deprecated
boolean acceptsProfiles(String... profiles);

boolean acceptsProfiles(Profiles profiles);

ConfigurableEnvironment

作用

这是一个配置接口,将由大多数(不是所有)环境类型的实现。提供用于设置活动配置文件和默认配置文件以及操作基础属性源的工具。允许客户端通过ConfigurablePropertyResolver 这个超级接口设置和验证所需属性、自定义转换服务等。

方法解析

//设置活动的配置文件
void setActiveProfiles(String... profiles);
// 增加活动的配置文件
void addActiveProfile(String profile);
// 设置默认的配置文件
void setDefaultProfiles(String... profiles);
// 获取PropertySource键值组合的集合
MutablePropertySources getPropertySources();
// 系统环境变量
Map<String, Object> getSystemEnvironment();
// 系统配置
Map<String, Object> getSystemProperties();
// 合并
void merge(ConfigurableEnvironment parent);

AbstractEnvironment

解析

如图,这是AbstractEnvironment的一些常量

image-20230116135821725

其次还有一些比较重要的变量

image-20230116135935601

我们可以看到customizePropertySources方法是一个模板方法,这个方法是交由子类去实现的,用于添加属性:

image-20230116140105977

StandardEnvironment

解析

StandardEnvironment通过customizePropertySources()方法添加了systemEnvironmentsystemProperties环境变量:

image-20230116140325402

StandardServletEnvironment

StandardServletEnvironment通过customizePropertySources()方法添加了servletConfigInitParamsservletContextInitParamsjndiProperties配置文件:

StandardServletEnvironment

StandardServletEnvironment通过customizePropertySources()方法添加了servletConfigInitParamsservletContextInitParamsjndiProperties配置文件:

image-20230116140417004

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

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

相关文章

持续丰富营销玩法 东风标致408X引领品牌向上焕新

1月5日&#xff0c;东风标致408X首秀——XSHOW开演&#xff0c;标致全球战略车型408X正式在中国亮相&#xff0c;定位为“新法式无界座驾”&#xff0c;它是东风标致全面向电动化、智能化、网联化的发展的一款汽车&#xff0c;也是引领东风标致向上焕新的一款全新车型。作为东风…

十五天学会Autodesk Inventor,看完这一系列就够了(终章),答疑

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

python SciPy 优化器

SciPy 优化器SciPy 的 optimize 模块提供了常用的最优化算法函数实现&#xff0c;我们可以直接调用这些函数完成我们的优化问题&#xff0c;比如查找函数的最小值或方程的根等。NumPy 能够找到多项式和线性方程的根&#xff0c;但它无法找到非线性方程的根&#xff0c;如下所示…

工具类库 Hutool介绍与使用(请记得收藏)

工具类库 Hutool介绍 Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;使Java拥有函数式语言般的优雅&#xff0c;让Java语言也可以“甜甜的”。Hutool中的工具方法来自于每个用户的精雕…

VMware vCenter上用OVF模板部署虚拟机

前言 在我们项目操作过程中&#xff0c;使用VMware vCenter系统&#xff0c;经常会出现使用原有部署环境来部署虚拟机&#xff0c;供项目组使用&#xff0c;此时我们克隆虚拟机就要用到OVF模板来克隆操作&#xff0c;这是一个非常实用的功能。 一、打开Vcenter&#xff0c;选定…

Redis学习笔记2_数据结构

Redis数据结构Redis数据结构二、数据结构2.1Redis核心对象2.2底层数据结构2.2.1 SDS-simple dynamic stringsds内存布局sds的操作为什么使用SDS&#xff0c;SDS的优势&#xff1f;2.2.2 listlist内存布局2.2.3 dictdict内存布局2.2.4 zskiplistzskiplist内存布局2.2.5 intsetin…

前端实现登录拼图验证

前言 不知各位朋友现在在 web 端进行登录的时候有没有注意一个变化&#xff0c;以前登录的时候是直接账号密码通过就可以直接登录&#xff0c;再后来图形验证码&#xff0c;数字结果运算验证&#xff0c;到现在的拼图验证。这一系列的转变都是为了防止机器操作&#xff0c;但对…

Python 第六章 函数

6.1函数的定义和调用6.1.1定义函数格式&#xff1a;def 函数名 ([参数列表]):["""文档字符串"""]函数体[return 语句]6.1.2函数调用格式&#xff1a;函数名([参数列表])python中函数可以嵌套定义例如&#xff1a;def add_modify(a,b):resultabpr…

Vue3响应式原理解析

前言 今年上半年开始&#xff0c;自己开始在新项目中使用 Vue3 进行开发&#xff0c;相比较于 Vue2 来说&#xff0c;最大的变化就是 composition Api 代替了之前的 options Api&#xff0c;更像是 React Hooks 函数式组件的编程方式。 Vue3相对于Vue2响应式原理也发生了变化…

vue日期组件el-date-picker中更改默认日期格式并且实时显示的方法

在项目中有一个需求是这样的,要求实时显示他的当前默认时间,并且不能修改 使用了默认:default-value"currentTime"属性之后,新增的时候会报错,前端与后端传递的数据不匹配 因为默认时间被new date() 解析之后返回的数据是默认时间形式的,格式不符 方法如下: 第一步&a…

Elasticsearch入门 - Mac上Elasticsearch和Kibana的安装运行与简单使用

文章目录一&#xff0c;Mac上Elasticsearch和Kibana的安装1.1 环境与下载1.2 安装与运行1.3 问题1.3.1 elasticsearch安装后其他机器不能访问1.3.2 kibana安装后其他机器不能访问二&#xff0c;Elasticsearch在Kibana的常见命令2.1 查看集群的健康状态2.2 索引2.2.1 查看所有索…

Scrum 敏捷开发

什么是敏捷开发 敏捷 开发是一个术语&#xff0c;用于描述迭代软件开发。 迭代软件开发通过在短增量完成工作&#xff08;通常称为 冲刺&#xff0c; Sprint&#xff09;来缩短 DevOps 生命周期。 冲刺通常长达一到四周。 敏捷开发通常与传统或瀑布式开发形成鲜明对比&#xff…

Vue基础9之脚手架的使用、ref属性、props配置项和mixin混入

Vue基础9使用Vue脚手架初始化脚手架说明具体步骤项目文件介绍将前面写好的单文件组件放入这里运行脚手架文件结构render的作用修改默认配置配置项ref属性props配置项简单的传值方法默认的字符串传值使用v-bind对数字类型进行传值限制数据类型接收数据时候只对数据类型进行限制接…

Java 搜索二维矩阵 II

搜索二维矩阵 II中等编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a;每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例 1&#xff1a;输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22]…

v-model表单

1、v-model的基本使用 表单提交是开发中非常常见的功能&#xff0c;也是和用户交互的重要手段&#xff1a; 比如用户在登录、注册时需要提交账号密码&#xff1b;比如用户在检索、创建、更新信息时&#xff0c;需要提交一些数据&#xff1b; 这些都要求我们可以在代码逻辑中获…

【GD32F427开发板试用】+软件IIC(OLED显示)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;四季的温度 gitee开源地址https://gitee.com/sijiwendu/gd32-f427-v/tree/master/module/oled 上一次完成DHT11开发文章https://aijishu.com/a…

什么是EDA?常见的EDA工具有哪些?

大家都知道&#xff0c;芯片设计难度非常大&#xff0c;要把上千亿颗晶体管集成在面积不到指甲盖大小的芯片上。其实能实现这样目标所以靠的是电子设计自动化&#xff08;Electronics Design Automation&#xff09;工具&#xff0c;也就是我们所称的EDA工具。 什么是EDA&…

从零搭建SpringCloud服务

一.微服务基础1.什么是SpringCloud&#xff1f;SpringCloud官网&#xff1a;https://spring.io/projects/spring-cloud&#xff08;个人建议是用谷歌浏览器访问官网打开中文翻译粗略把官网读一遍&#xff09;个人理解&#xff1a;以前的服务器就好像&#xff0c;一个会语数外全…

Elasticsearch:从实例中学习 nested 数据类型的 CRUD 及搜索

nested 数据类型是一个比较高级的话题。在本文中&#xff0c;将介绍 Elasticsearch 中针对嵌套对象的一些高级 CRUD 和搜索查询。 如果你想了解有关 Elasticsearch 基础知识的更多信息&#xff0c;可以查看这些文章以快速入门或复习&#xff1a; Elasticsearch&#xff1a;关于…

koa-router 正解

Koa-Router 之前分析过 Koa/ Koa-Bodyparser 的源码&#xff0c;今天让我们来分析下koa-router的源码&#xff0c;这个插件其实还是挺重要的。毕竟作为路由&#xff0c;我们还是要知道他的工作原理 这里会重申下 其实我是分析了 koa-router 主干流程。一些小众类的方法并没有看…