当前位置: 首页 > news >正文

spring boot和spring cloud项目中配置文件application和bootstrap中的值与对应的配置类绑定处理

在前面的文章基础上

https://blog.csdn.net/zlpzlpzyd/article/details/136065211

加载完文件转换为 Environment 中对应的值之后,接下来需要将对应的值与对应的配置类进行绑定,方便对应的组件取值处理接下来的操作。

对应的配置值与配置类绑定通过 ConfigurationPropertiesBindingPostProcessor 来处理。

首先调用 ApplicationContextAware#setApplicationContext() 将 ApplicationContext 对象向当前类赋值。

然后利用上面的 ApplicationContext  调用 InitializingBean#afterPropertiesSet() 进行 BeanDefinitionRegistry 和 ConfigurationPropertiesBinder 获取。

最后调用 BeanPostProcessor#postProcessBeforeInitialization() 进行前置处理,调用 ConfigurationPropertiesBinder 中的方法处理后面的绑定值逻辑。

获取 Binder 对象进行绑值处理

通过 findProperty() 找到对应的属性,对应值不为空返回

调用 SpringConfigurationPropertySources 的迭代器将 Environment 中的值复制到变量 cache 中。

遍历时生成 SpringConfigurationPropertySources$SourcesIterator,将 sources 中的值传递到 SourcesIterator 的 iterators 变量中。

首次迭代为 environmentProperties,对应接口 ConfigurableEnvironment 的实现类 StandardServletEnvironment。

遍历变量 sources 中的元素 environmentProperties 的迭代器中的数据

0 = {ConfigurationPropertySourcesPropertySource@4977} "ConfigurationPropertySourcesPropertySource {name='configurationProperties'}"
1 = {PropertySource$StubPropertySource@4978} "StubPropertySource {name='servletConfigInitParams'}"
2 = {PropertySource$StubPropertySource@4979} "StubPropertySource {name='servletContextInitParams'}"
3 = {PropertiesPropertySource@4886} "PropertiesPropertySource {name='systemProperties'}"
4 = {SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource@4882} "OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'}"
5 = {RandomValuePropertySource@4880} "RandomValuePropertySource {name='random'}"
6 = {MapPropertySource@4892} "MapPropertySource {name='springCloudClientHostInfo'}"
7 = {OriginTrackedMapPropertySource@4890} "OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.yml]'}"
8 = {OriginTrackedMapPropertySource@4888} "OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/bootstrap.yml]'}"
9 = {MapPropertySource@4894} "MapPropertySource {name='springCloudDefaultProperties'}"
10 = {CachedRandomPropertySource@4896} "CachedRandomPropertySource {name='cachedrandom'}"

cache 中的数据

{RandomValuePropertySource@4994} "RandomValuePropertySource {name='random'}" -> {SpringConfigurationPropertySource@4995} "RandomValuePropertySource {name='random'}"
{SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource@4996} "OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'}" -> {SpringIterableConfigurationPropertySource@4997} "OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'}"
{PropertiesPropertySource@4998} "PropertiesPropertySource {name='localProperties'}" -> {SpringIterableConfigurationPropertySource@4999} "PropertiesPropertySource {name='localProperties'}"
{PropertiesPropertySource@5000} "PropertiesPropertySource {name='systemProperties'}" -> {SpringIterableConfigurationPropertySource@5001} "PropertiesPropertySource {name='systemProperties'}"
{OriginTrackedMapPropertySource@5002} "OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/bootstrap.yml]'}" -> {SpringIterableConfigurationPropertySource@5003} "OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/bootstrap.yml]'}"
{OriginTrackedMapPropertySource@5004} "OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.yml]'}" -> {SpringIterableConfigurationPropertySource@5005} "OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.yml]'}"
{MapPropertySource@5006} "MapPropertySource {name='springCloudClientHostInfo'}" -> {SpringIterableConfigurationPropertySource@5007} "MapPropertySource {name='springCloudClientHostInfo'}"
{MapPropertySource@5008} "MapPropertySource {name='springCloudDefaultProperties'}" -> {SpringIterableConfigurationPropertySource@5009} "MapPropertySource {name='springCloudDefaultProperties'}"
{CachedRandomPropertySource@5010} "CachedRandomPropertySource {name='cachedrandom'}" -> {SpringConfigurationPropertySource@5011} "CachedRandomPropertySource {name='cachedrandom'}"

以迭代器中的值顺序为准与 cache 中进行比对,返回对应的配置类,然后再将对应的配置属性从对应的配置文件中获取。

可以发现,对应配置值顺序如下

如果 jvm 虚拟机参数中未指定,获取环境变量中的值

如果环境变量中未指定,获取 application 配置文件中的值

如果 application 配置文件中未指定,获取 bootstrap 配置文件中的值

如果 bootstrap 配置文件中未指定,获取外部配置文件中的值

这样参数的顺序正好对应起来最后匹配 bootstrap 值的问题,例如项目中使用了 nacos 中的配置中心功能,很多参数不需要在项目中进行配置,在 nacos 中进行指定就可以,但是 nacos 中的配置参数与项目是隔离的。

调用 DataObjectBinder 的实现类 JavaBeanBinder 将变量值设置到对应的配置类中

 

可以发现,最终赋值操作通过反射处理。

相关文章:

spring boot和spring cloud项目中配置文件application和bootstrap中的值与对应的配置类绑定处理

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136065211 加载完文件转换为 Environment 中对应的值之后,接下来需要将对应的值与对应的配置类进行绑定,方便对应的组件取值处理接下来的操作。 对应的配置值与配置类绑定通过 Con…...

每天一个数据分析题(一百五十四)

给定下面的Python代码片段&#xff0c;哪个选项正确描述了代码可能存在的问题&#xff1f; from scipy import stats 返回异常值的索引 z stats.zscore(data_raw[‘Age’]) z_outlier (z > 3) | (z < -3) z_outlier.tolist().index(1) A. 代码将返回数据集Age列中第…...

Django从入门到放弃

Django从入门到放弃 Django最初被设计用于具有快速开发需求的新闻类站点&#xff0c;目的是实现简单快捷的网站开发。 安装Django 使用anaconda创建环境 conda create -n django_env python3.10 conda activate django_env使用pip安装django python -m pip install Django查…...

C++中类的6个默认成员函数【构造函数】 【析构函数】

文章目录 前言构造函数构造函数的概念构造函数的特性 析构函数 前言 在学习C我们必须要掌握的6个默认成员函数&#xff0c;接下来本文讲解2个默认成员函数 构造函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c…...

06-Java适配器模式 ( Adapter Pattern )

原型模式 摘要实现范例 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁 适配器模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能 举个真实的例子&#xff0c;读卡器是作为内存卡和笔记本之间的适配器。您将内…...

C# CAD交互界面-自定义面板集-添加快捷命令(五)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System; using System.Drawing; using System.Windows.Forms; 二、代码说明 [CommandMethod("Cre…...

Spring boot集成各种数据源操作数据库

一、最基础的数据源方式 1.导入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency <dependency><groupId>com.mysql</groupId><art…...

K8s环境下rook-v1.13.3部署Ceph-v18.2.1集群

文章目录 1.K8s环境搭建2.Ceph集群部署2.1 部署Rook Operator2.2 镜像准备2.3 配置节点角色2.4 部署operator2.5 部署Ceph集群2.6 强制删除命名空间2.7 验证集群 3.Ceph界面 1.K8s环境搭建 参考&#xff1a;CentOS7搭建k8s-v1.28.6集群详情&#xff0c;把K8s集群完成搭建&…...

【JavaEE】传输层网络协议

传输层网络协议 1. UDP协议 1.1 特点 面向数据报&#xff08;DatagramSocket&#xff09;数据报大小限制为64k全双工不可靠传输有接收缓冲区&#xff0c;无发送缓冲区 UDP的特点&#xff0c;我理解起来就是工人组成的**“人工传送带”**&#xff1a; 面向数据报&#xff08;…...

08-Java过滤器模式 ( Filter Pattern )

Java过滤器模式 实现范例 过滤器模式&#xff08;Filter Pattern&#xff09;或允许开发人员使用不同的标准来过滤一组对象&#xff0c;通过逻辑运算以解耦的方式把它们连接起来 过滤器模式&#xff08;Filter Pattern&#xff09; 又称 标准模式&#xff08;Criteria Pattern…...

ChatGPT高效提问—prompt常见用法(续篇八)

ChatGPT高效提问—prompt常见用法(续篇八) 1.1 对抗 ​ 对抗是一个重要主题,深入探讨了大型语言模型(LLM)的安全风险。它不仅反映了人们对LLM可能出现的风险和安全问题的理解,而且能够帮助我们识别这些潜在的风险,并通过切实可行的技术手段来规避。 ​ 截至目前,网络…...

微软.NET6开发的C#特性——接口和属性

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…...

容器基础知识:容器和虚拟化的区别

虚拟化与容器化对比 容器化和虚拟化都是用于优化资源利用率并实现高效应用程序部署的技术。然而&#xff0c;它们在方法和关键特征上存在差异&#xff1a; 虚拟化: 可以理解为创建虚拟机 (VM)。虚拟机模拟一台拥有自己硬件&#xff08;CPU、内存、存储&#xff09;和操作系统…...

【Linux】vim的基本操作与配置(下)

Hello everybody!今天我们继续讲解vim的操作与配置&#xff0c;希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了&#xff0c;在底行模式下set nu可以显示行号。今天补充一条&#xff1a;set nonu可以取消行号。这两条命令大家看看就可…...

[office] 图文演示excel怎样给单元格添加下拉列表 #知识分享#经验分享

图文演示excel怎样给单元格添加下拉列表 在Excel表格中输入数据的时候&#xff0c;为了简便快捷的输入&#xff0c;经常需要给Excel单元格添加一个下拉菜单&#xff0c;这样在输入数据时不必按键盘&#xff0c;只是用鼠标选择选项就可以了。 比的位置。 4、可以看到一个预览的…...

【RT-DETR有效改进】利用SENetV2重构化网络结构 (ILSVRC冠军得主,全网独家首发)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是SENetV2,其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫),其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而…...

【Linux】学习-进程间通信

进程间通信 介绍 进程间通信的本质 进程间通信的前提&#xff0c;首先需要让不同的进程看到同一块“内存”此“内存”一定不属于任何进程&#xff0c;而应该强调共享二字 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;…...

45. C++ 字符指针和字符串

一、字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如&#xff0c;有说明语句&#xff1a; char *str "This is a string.";是对字符指针进行初始化。此时&#xff0c;字符指针指向的是一个字符串常量的首地址&#xff0c;即指向字符…...

如何制作一款3D FPS游戏

制作一款3D FPS游戏是一个复杂的过程&#xff0c;需要涵盖多个方面&#xff0c;包括游戏设计、游戏引擎选择、模型制作、音效制作、关卡设计等。下面是一个关于如何制作一款3D FPS游戏的超长文章。 游戏设计 首先&#xff0c;你需要确定游戏的整体设计和核心玩法。这包括游戏的…...

人工智能|深度学习——使用多层级注意力机制和keras实现问题分类

代码下载 使用多层级注意力机制和keras实现问题分类资源-CSDN文库 1 准备工作 1.1 什么是词向量? ”词向量”&#xff08;词嵌入&#xff09;是将一类将词的语义映射到向量空间中去的自然语言处理技术。即将一个词用特定的向量来表示&#xff0c;向量之间的距离&#xff08;例…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...