springboot源码分析8-环境属性构造过程(下)

简介: 上一文springboot源码分析7-环境属性构造过程(上)中详细讲解了springboot环境的各种初始化操作。本文我们继续探讨一下环境的一些知识点。

上一文springboot源码分析7-环境属性构造过程(上)中详细讲解了springboot环境的各种初始化操作。本文我们继续探讨一下环境的一些知识点。

首先,我们看一下抽象基类AbstractEnvironment。该类中的构造函数如下:

1 private final MutablePropertySources propertySources = new MutablePropertySources(this.logger);

2 public AbstractEnvironment() {

3  customizePropertySources(this.propertySources);

4  }

该类的构造函数中会直接调用customizePropertySources方法,customizePropertySources方法是个空的方法,因此最终各种子类一定回去重写该方法的,这个我们上个章节详细地说明过。这里重点看下customizePropertySources方法中的入参propertySourcespropertySourcesAbstractEnvironment类中已经实例化了。而且是个对象因此是引用类型,因此所有的自类都是可以拿到这个对象的引用的。propertySources为MutablePropertySources类型。MutablePropertySources 我们需要重点的讲解一下。

1.1. MutablePropertySources

 MutablePropertySources类的层级结构图如下所示:

 

 

MutablePropertySources类实现了PropertySources接口。该类中持有了所有的一个propertySourceList集合。propertySourceList集合中的元素类型是PropertySourcePropertySource类的作用,前面的章节也详细讲解了,因此这里不再赘述。MutablePropertySources中所定义的大部分想法均是对propertySourceList集合进行操作,比如在该集合的头部添加元元素、尾部添加元素、在指定的元素之后添加元素。该类的核心方法如下所示:

 

 

这里以addLast方法为例进行说明:

1 public void addLast(PropertySource<?> propertySource) {

2  removeIfPresent(propertySource);

3  this.propertySourceList.add(propertySource);

4  }

首先调用了removeIfPresent方法,然后直接将propertySource添加到propertySourceList集合中,removeIfPresent方法实现逻辑如下:

1 protected void removeIfPresent(PropertySource<?> propertySource) {

2  this.propertySourceList.remove(propertySource);

3  }

逻辑非常的简单,直接将propertySourcepropertySourceList集合中进行移除。

在这里简单补充一点:所有的PropertySource以及子类均存储在propertySourceList集合中,而该集合是一个List类型,List是有顺序的,因此最终的元素添加顺序,决定了元素的最终遍历查找顺序,这里一定要注意。关于propertySourceList集合的元素添加方式,如下所示:

1 protected void customizePropertySources(MutablePropertySources propertySources) {

2 propertySources.addLast(new MapPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));

3  propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));

4  }

后续文章,我们重点讲解各种PropertySource以及子类的使用。


欢迎关注我的微信公众号,第一时间获得博客更新提醒,以及更多成体系的Java相关原创技术干货。 
扫一扫下方二维码或者长按识别二维码,即可关注。
 



相关文章
|
5月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
2月前
|
druid Java Maven
|
2月前
|
Java 应用服务中间件 Maven
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
371 0
|
4月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
57 0
|
6月前
|
运维 安全 Java
SpringBoot运维篇(打包,多环境,日志)
SpringBoot运维篇(打包,多环境,日志)
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的环境保护生活App附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的环境保护生活App附带文章源码部署视频讲解等
71 0
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的营商环境行动计划管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的营商环境行动计划管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
30 0
|
6月前
|
Java 测试技术 数据库
【单文件版本】java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境
【单文件版本】java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境
63 0
|
6月前
|
Java 测试技术 数据库
java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境【多文件版本】
java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境【多文件版本】
96 0
|
6月前
|
Java 关系型数据库 MySQL
SpringBoot系列教程之事务传递属性
SpringBoot系列教程之事务传递属性