Spring与SpringBoot在配置读取方式上的区别

1. 问题说明

将Springboot项目中自定义的一个扩展工具类移植到Spring框架项目中的时候发现一个问题。在springboot中application.yml中的配置内容可以从Environment中获取,但是在spring中context:placeholder对应的配置文件中的配置却无法从Environment中获取。为了搞清楚这一问题,对该部分源码进行深入阅读。

2. Spring中placeholder

2.1 核心源码

2.2 代码示例

import org.junit.jupiter.api.Test;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySourcesPropertyResolver;import java.util.Properties;/*** @author pp_lan*/
public class PropertiesPropertySourceDemo {@Testpublic void test01() {Properties properties = new Properties();properties.put("dbType", "postgresql");PropertiesPropertySource simplePropertySource = new PropertiesPropertySource("simple", properties);MutablePropertySources propertySources = new MutablePropertySources();propertySources.addLast(simplePropertySource);PropertySourcesPropertyResolver resolver = new PropertySourcesPropertyResolver(propertySources);String dbType = resolver.resolvePlaceholders("${dbType}");System.out.println(dbType);}
}
DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'dbType' in PropertySource 'simple' with value of type StringpostgresqlProcess finished with exit code 0

3. Springboot中application.yml

3.1 流程图

3.2 源码解析

3.2.1 EnvironmentPostProcessorApplicationListener

3.2.2 加载所有的postProcessor,包括自定义的扩展类

类名

作用

SystemEnvironmentPropertySourceEnvironmentPostProcessor

加载环境变量

ConfigDataEnvironmentPostProcessor

读取配置处理类

3.2.3 读取配置回填入口

org.springframework.boot.context.config.ConfigDataEnvironment

3.2.4 配置读取

org.springframework.boot.context.config.ConfigDataEnvironmentContributor

org.springframework.boot.context.config.StandardConfigDataLoader

StandardConfigDataLoader.load根据resouce的类型选择对应的策略sourceLoader(例如:yml文件选择YamlPropertySourceLoader)

org.springframework.boot.env.YamlPropertySourceLoader

4. 总结

二者主要区别如下:

  • placeholder的方式为变量替换
  • application.yml的读取是将配置内容放入到environment中

因此,导致了Spring无法从Environment中读取的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第67天:APP攻防-Frida反证书抓包移动安全系统资产提取评估扫描

思维导图 案例一:内在-资产提取-AppinfoScanne AppinfoScanner 一款适用于以 HW 行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具,可以帮助渗透测试工程师、攻击队成员、红队成员快速收集到移动端或者静态 WEB …

文字转粤语语音怎么转?文字转语音

文字转粤语语音怎么转?文字转粤语语音的应用,不仅展现了现代科技的魅力,也为我们提供了更加便捷的交流方式。它们将文字转化为粤语发音,让我们能够更直观地感受粤语的韵味和魅力。同时,这些软件还具备高度的可定制性&a…

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言,合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则,并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”,…

Java:开发环境配置Windows/Liunx

Windows环境下JAVA_JDK安装及环境变量配置 (1)下载JDK,Java Downloads | Oracle (2)根据电脑的系统选择64位的版本进行下载 (3)下载完成,直接双击安装,所有选项直接默认…

Redis(四) 主从、哨兵、集群环境搭建

结合前三期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客) Redis(二) 可编程性(Redis(二) 可编程性-CSDN博客) Redis(三) 事务与发布订阅(Redis(三) 事务与发布订阅-CSDN博客) 目录 1.0 Redis主从 1.1 Redis 主从结构的基本原理和工作方式 1.2 Redis 主从结构的好处 …

数据结构(Wrong Question)

一、绪论 1.1 数据结构的基本概念 D 因为抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据对象,基本操作集)这样的三元组来表示,从而可构成一个完整的数据结…

Redis篇:缓存击穿及解决方案

1.何为缓存击穿 缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了(有可能是正好过期了),无数的请求访问会在瞬间给数据库带来巨大的冲击。 常见的解决方案有两种: 互斥锁 逻…

【Linux】深入理解Linux文件系统与日志分析

目录 一、inode与block 1.block与inode概述 2.inode的内容 3.inode号码 4.inode的大小 5.访问文件的简单流程 6.inode的特殊作用 7.通过indoe号删除rm常规方法删除不掉的文件 二、硬链接和软链接 三、恢复误删除的文件 1.恢复EXT类型的文件 示例 2.xfs类型文件备份…

【全网首发】Mogdb 5.0.6新特性:CM双网卡生产落地方案

在写这篇文章的时候,刚刚加班结束,顺手写了这篇文章。 前言 某大型全国性行业核心系统数据库需要A、B两个物理隔离的双网卡架构方案,已成为行业标准。而最新发布的MogDB 5.0.6的CM新增支持流复制双网段部署,用于网卡级高可用容灾(…

读天才与算法:人脑与AI的数学思维笔记08_生物的创造力

1. 生物的创造力 1.1. 在进化树中是否有其他的物种已经具有与我们人类相当的创造力水平 1.2. 20世纪50年代中期,动物学家德斯蒙德莫里斯(Desmond Morris)在伦敦动物园做了这样一个试验 1.2.1. 动物学家给…

【hackmyvm】 Quick2靶机

渗透流程 渗透开始1.IP地址 获取2.端口扫描3.任意文件读取4.扫描目录5.总结信息6.漏洞扫描7.php_filter_chain_generator.py使用8.提权 渗透开始 1.IP地址 获取 ┌─[✗]─[userparrot]─[~] └──╼ $fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.124 本机 192.1…

“PowerInfer:消费级GPU上的高效大语言模型推理引擎“

PowerInfer是由上海交通大学IPADS实验室开发的一个高效大语言模型(LLM)推理引擎,专为个人电脑(PC)上的消费者级GPU设计。它通过利用LLM推理中的高局部性,实现了快速且资源消耗低的模型推理,这一…