springboot创建并配置环境(二) - 配置基础环境

news2024/9/20 20:36:59

文章目录

  • 一、介绍
  • 二、配置系统属性和环境变量
  • 三、配置自定义属性命令行参数
  • 四、作为应用配置信息

一、介绍

在上一篇文章:springboot创建并配置环境(一) - 创建环境中我们探讨了springboot是如何根据当前应用程序类型去创建对应的环境实例的。接下来探讨如何去配置完善该运行环境。

下面我们以标准环境StandardEnvironment为例进行分析。

二、配置系统属性和环境变量

首先我们应该判断在创建一个运行环境实例对象时,在构造器内部是否就已经开始对某些配置属性进行处理了。

在创建运行环境实例时,是通过标准环境StandardEnvironment的无参构造方法完成的,进入该构造方法后发现它是一个空方法

在这里插入图片描述

由于该类继承于AbstractEnvironment,那么在执行StandardEnvironment的构造方法时会默认先调用父类的无参构造方法,接下来再看父类的无参构造。

在这里插入图片描述

在该无参构造中,先实例化一个MutablePropertySources对象,然后再调用了下面的有参构造方法,并对propertySourcespropertyResolver这两个属性进行初始化。

  • MutablePropertySources

    该类内部维护了一个PropertySource集合,该集合中保存着大量以key,value形式的属性配置,且value值可以是任何数据类型。mutable意为可变的,表示允许调用方去修改其内部的属性配置。如下图所示

    在这里插入图片描述

    看到PropertiySource大家是否还有印象,我们在springboot从命令行读取应用程序参数这篇文章中有介绍过,它其实就是一个以key,value形式的属性配置对象,且value值可以是任何数据类型(用泛型T表示)。

  • propertySources

    该属性指向MutablePropertySources对象。

  • propertyResolver

    属性解析器,提供一些从propertySources中获取所需要的属性的方法。

该运行环境实例的两个重要属性初始化完成后,该实例就具备了利用属性解析器propertyResolver解析配置属性并将解析后的结果保存到propertySources中的功能了。

接下来我们再看customizePropertySources()方法做了什么?从命名上来看,它可以自定义地添加一些属性,查看该方法是一个空方法

在这里插入图片描述

那么我们再回到它的子类StandardEnvironment查看该方法实现。

在这里插入图片描述

在该方法中,我们可以看到,通过调用MutablePropertySourcesaddLast()方法,向其内部的PropertySource集合尾部添加两种属性:PropertiesPropertySourceSystemEnvironmentPropertySource

这两个类都是PropertiySource抽象类的实现类,用于保存不同类型的属性,但他们本质上都是PropertiySource实例。其中

  • PropertiesPropertySource

    该类用于保存系统属性,其中key为systemPropertiesvalue为Map集合,该集合中保存所有系统属性

  • SystemEnvironmentPropertySource

    该类用于保存系统环境变量,其中key为systemEnvironmentvalue为Map集合,该集合中保存所有系统环境变量

另外,PropertiySource还有很多种不同的实现类,用于保存不同类型的属性,如下所示

在这里插入图片描述

下面我们用图示将当前已经保存的属性、以及目前运行环境保存属性的结构表示出来

在这里插入图片描述

好了,说了这么多我会不会是在瞎说,我们测一下就好了,把断点打在创建标准环境StandardEnvironment实例的下一行,查看此时运行环境中的属性

在这里插入图片描述

  • 系统属性

    从调试中我们看到,springboot找到了64个系统属性

    在这里插入图片描述

  • 系统环境变量

    从调试中我们看到,springboot找到了65个系统环境变量

    在这里插入图片描述

三、配置自定义属性命令行参数

自定义属性主要是来自命令行参数。在前面的文章springboot读取命令行参数中我们已经详细介绍过springboot是如何读取命令行参数并将其保存在ApplicationArguments对象中的,但这些来自命令行的参数目前并不能作为启动环境信息、,需要将其也保存到启动环境中。

我们继续读prepareEnvironment()方法源码,来到configureEnvironment()这一行,

在这里插入图片描述

进入configureEnvironment()方法,该方法的逻辑主要分三部分,其中第一部分设置类型转换器

在这里插入图片描述

该方法的处理逻辑主要分三部分

  • 设置类型转换器

    该部分逻辑只是向环境中设置一些springboot内置的类型转换器Convertor,本篇文章不具体展开来讲。

  • 配置自定义的普通参数

    在这里插入图片描述

    • 首先将默认属性配置添加到MutablePropertySources的尾部

      默认属性配置的设置方法是通过SpringApplication对象的setDefaultProperties()方法设置的,如下所示

      在这里插入图片描述

    • 配置命令行参数

      在前面的文章springboot读取命令行参数我们已经详细介绍过springboot如何将命令行参数转为SimpleCommandLinePropertySource,本文就不再赘述。

      在这一步会先判断我们已经保存的属性配置中是否已经存在key=commandLineArgs了,从我们逐行阅读源码的过程中我们可以断定是不存在这样的属性的,因此会执行else代码块,即只需要将SimpleCommandLinePropertySource添加到已经保存的属性配置的首部即可。

      此时我们再次用图示将当前已经保存的属性、以及目前运行环境保存属性的结构表示出来

      在这里插入图片描述

      当然了,如果你想拒绝任何来自命令行的属性参数,可以通过以下方法将addCommandLineProperties属性设置为false,这样springboo就不会把命令行参数保存到启动环境中了

      在这里插入图片描述

  • 配置来自命令行的profile

    该方法为空方法,保留该方法方面日后扩展。

    在这里插入图片描述

四、作为应用配置信息

在处理完自定义的属性后,下一步springboot需要对当前启动环境中的属性配置适配ConfigurationPropertySources的支持,如下图所示

在这里插入图片描述

进入attach()方法,如下所示

在这里插入图片描述

该方法执行后的结果就是将当前启动环境中已保存的属性配置source封装到一个ConfigurationPropertySourcesPropertySource对象中,并且对应的key=configurationProperties,此时启动环境中保存的属性配置如下所示

在这里插入图片描述

至于为什么这么做,我们可以看一下方法注释:

Attach a ConfigurationPropertySource support to the specified Environment. Adapts each PropertySource managed by the environment to a ConfigurationPropertySource and allows classic PropertySourcesPropertyResolver calls to resolve using configuration property names.
The attached resolver will dynamically track any additions or removals from the underlying Environment property sources.

从注释中得知,该方法的目的就是真正的把当前保存在启动环境中的这些propertySources作为配置属性,就是说这些属性在此之前springboot并没有把他们作为配置来看,如今它们成为了配置属性

点此进入上一集:springboot创建并配置环境(一) - 创建环境

点此进入下一集:springboot创建并配置环境(三) - 配置扩展属性(上集)



纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————

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

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

相关文章

java上传和解压任意压缩包

java上传zip文件并解压读取_java上传压缩包解压_梓隽的博客-CSDN博客 添加依赖 <dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>7.4.1</version></dependency><dependency&g…

无涯教程-jQuery - hide( speed, callback)方法函数

hide(speed&#xff0c;[callback])方法使用优美的动画隐藏所有匹配的元素&#xff0c;并在完成后触发可选的回调。 hide( speed, [callback] ) - 语法 selector.hide( speed, [callback] ); 这是此方法使用的所有参数的描述- speed - 代表三个预定义速度("slow…

四. 点云着色(真彩点云)方案

前面内容&#xff1a; 一. 器件选型心得&#xff08;系统设计&#xff09;--1_goldqiu的博客-CSDN博客 一. 器件选型心得&#xff08;系统设计&#xff09;--2_goldqiu的博客-CSDN博客 二. 多传感器时间同步方案&#xff08;时序闭环&#xff09;--1 三. 多传感器标定方案&…

【业务功能篇57】Springboot + Spring Security 权限管理 【上篇】

4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中&#xff0c;通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源&#xff0c;分配用户菜单、资源权限&#xff0c;以及验证用户是否有访问资源权限。 4.1.2 RBAC权限设计模型 …

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal 第六章 小程序事件绑定、动态提示Toast、对话框 Modal 文章目录 【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal前言一、事件是什么&#xff1f;二、小程序中常用事件三、事件传…

iOS--多线程原理

进程、线程与队列 进程的定义 进程是指在系统中正在运行的一个应用程序&#xff0c;如微信、支付宝app都是一个进程每个进程之间是独立的&#xff0c;每个进程均运行在齐专用的且受保护的内存 线程的定义 线程是进程的基本执行单元&#xff0c;一个进程的所有任务都在线程中…

【牛客网】链表的回文结构

思路1&#xff1a;找到中间节点&#xff0c;从中间节点向后反转链表 寻找链表的中间节点和反转链表的程序已经讲解过 寻找链表的中间节点&#xff1a;CSDN 反转链表&#xff1a;CSDN 然后从头节点和中间节点依次向后比较节点的值 &#x1f4d6;Note: 后半段链表反转后&#xff…

每天100w次登陆请求, 8G 内存该如何设置JVM参数?

一、新系统上线如何规划容量&#xff1f; 1.套路总结 任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数&#xff0c;这个容量与资源规划并不仅仅是系统架构师的随意估算的&#xff0c;需要根据系统所在业务场景去估算&#xff0c;推断出来一个系统运行模型&…

事后多重比较方法

一、案例介绍 由单因素方差分析案例中&#xff0c;为研究郁金对低张性缺氧小鼠存活时间的影响&#xff0c;将36只小鼠随机生成A、B以及 C 三组&#xff0c;每组12个&#xff0c;雌雄各半&#xff0c;分别以10g/kg、20g/kg、40g/kg三种不同剂量的郁金灌胃&#xff0c;各组小鼠均…

vue elementui table去掉滚动条与实现表格自动滚动且无滚动条

当table内容列过多时&#xff0c;可通过height属性设置table高度以固定table高度、固定表头&#xff0c;使table内容可以滚动。 现在需求是右侧滚动条不好看&#xff0c;需要去除滚动条&#xff0c;并隐藏滚动条所占列的位置。让他可以滚动但是不出现滚动条,不然即时隐藏了滚动…

运动蓝牙耳机有什么推荐的?这几款非常值得入手!

运动不仅能够锻炼身体&#xff0c;还能调节情绪释放压力&#xff0c;每到周末均会去徒步或骑行&#xff0c;路途上少不了音乐的相伴&#xff0c;运动期间会佩戴耳机聆听音乐&#xff0c;边聆听喜欢的音乐或有声读物&#xff0c;边享受当下的美景。骨传导耳机可以说在多种耳机当…

每天一个电商API分享:获得淘宝商品快递费用 API

在电商行业中&#xff0c;快递费用是一项不容忽视的重要开支。随着电商行业的不断发展壮大&#xff0c;越来越多的消费者选择在线购物&#xff0c;这就增加了电商企业的订单量和物流压力。在这个过程中&#xff0c;快递费用起到了承载和运输商品的重要作用。 首先&#xff0c;…

easyUI框架学习

文章目录 一、前言二、引入使用easyUI 三、用法3.1 Dialog&#xff08;对话框窗口&#xff09;3.1.1 示例13.1.2 示例2 3.2 Layout&#xff08;布局&#xff09;3.2.1 示例1——通过标签创建布局3.2.2 示例2—— 创建嵌套布局 3.3 DateBox&#xff08;日期输入框&#xff09;3.…

【Spring框架】Bean作用域和生命周期

目录 Bean作用域设置Bean作用域生命周期⽣命周期演示 Bean作用域 Bean作用域指的是Bean在Spring容器中的某种行为(单例、原型…)。 Bean的6种作用域 singleton&#xff1a;单例作⽤域prototype&#xff1a;原型作⽤域&#xff08;多例作⽤域&#xff09;request&#xff1a;请…

Jenkins 配置maven和jdk

前提:服务器已经安装maven和jdk 一、在Jenkins中添加全局变量 系统管理–>系统配置–>全局属性–>环境变量 添加三个全局变量 JAVA_HOME、MAVEN_HOME、PATH 二、配置maven 系统管理–>全局工具配置–>maven–>新增 新增配置 三、配置JDK 在系统管…

node.js旅游景点分享网站【纯干货分享,免费领取源码03796】

node.js旅游景点分享网站 摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计&#xff0c;主要的模块包括查看后台首页、轮播图&#xff08;轮播图管理&#xff09;、网站公告…

QSlider 样式 Qt15.15.2 圆形滑块

在看文档的时候测试了一下demo&#xff0c;然后发现了一个有意思的东西&#xff0c;自定义滑块为带边框的圆形。 在设置的时候边框总是和预期的有点误差&#xff0c;后来发现了这样一个计算方式可以画一个比较标准的圆。&#xff08;ABCDEF在下方代码块内&#xff09; 滑块的…

自定义信号槽机制

自定义信号槽机制 自定义信号自定义槽自定义信号和槽函数的使用解决办法 如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意: 要编写新的类并且让其继承Qt的某些标准类这个新的子类必须从QObject类或者是QObject子类进行派生在定义类的头文件中加入 Q_…

linux上适用的反汇编调试软件(对标od)

ubuntu下类似于od软件 经过搜索&#xff0c;在Ubuntu上选用edb-debugger进行动态调试&#xff0c; 下载链接: https://github.com/eteran/edb-debugger 但是依赖反汇编引擎: https://github.com/capstone-engine/capstone 安装 先安装capstone 先下载release的版本&#xf…

有类型地址

有类型地址 子网号&#xff1a;基于网络号上划分。 A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E 类地址开头不同&#xff0c;是为了让网络不重叠。 A 类型 0 开头 网络号&#xff1a;8 位&#xff08;1 个字节&#xff09;。 主机号&#xff1a;24 位&#xff0…