阿里二面和面试官争论Spring程序配置优先级

news/2025/3/13 19:22:57/文章来源:https://www.cnblogs.com/JavaEdge/p/18677133

0 前言

一般用application.yml实现Spring Boot应用参数配置。但Spring配置有优先级,避免重复配置项的覆盖,须清晰优先级。

Spring通过Environment抽象出:

  • Profile:规定场景。定义诸如dev、test、prod等环境
  • Property:PropertySources,各种配置源。一个环境中可能有多个配置源,每个配置源有许多配置项。查询配置信息时,按配置源优先级进行查询

Property是如何查询配置的?

首先看下配置的优先级:

env.getPropertySources().stream().forEach(System.out::println);

如下共九个配置源:

  • systemProperties
    系统配置
  • applicationConfig
    配置文件,我们的 yml 文件配置。如 application.yml 和 bootstrap.yml,首先加载bootstrap.yml。

其中的OriginAwareSystemEnvironmentPropertySource就是我们的application.yml

StandardEnvironment,继承自

AbstractEnvironment

  • MutablePropertySources#propertySources
    所有的配置源
  • getProperty
    通过PropertySourcesPropertyResolver类进行查询配置
  • 实例化PropertySourcesPropertyResolver时,传入了当前的MutablePropertySources

那就来具体看看该类:

MutablePropertySources

PropertySourcesPropertyResolver

构造器传入后面用来遍历的propertySources

结合AbstractEnvironment,这个propertySources就是AbstractEnvironment#MutablePropertySources

遍历时,若发现配置源中有对应K的V,则使用该V。
所以MutablePropertySources中的配置源顺序很关键。

  • 真正查询配置的方法

    在查询所有配置源时,NO.1的 ConfigurationPropertySourcesPropertySource并非一个实际存在的配置源,而是一个代理。debug 下查看到"user.name"的值是由它提供并返回,且没有再遍历后面的PropertySource看看有无"user.name"

ConfigurationPropertySourcesPropertySource

  • getProperty()最终还调用findConfigurationProperty查询对应配置

  • 上图中getSource()结果就是SpringConfigurationPropertySources

  • 其中包含的配置源列表

    第一个就是ConfigurationPropertySourcesPropertySource,这遍历不会导致死循环吗?

注意到configurationProperty的实际配置是从系统属性来的。

SpringConfigurationPropertySources


ConfigurationPropertySourcesPropertySource是所有配置源的NO.1,其早就知道了PropertySourcesPropertyResolver的遍历逻辑。

那知道遍历逻辑后,如何暗箱操作可以让自己成为南波湾配置源?

ConfigurationPropertySourcesPropertySource实例化时
ConfigurationPropertySourcesPropertySource是在ConfigurationPropertySources#attach中被 new 出来的。

获得MutablePropertySources,把自己加入成为第一

这个attach方法就是在Spring应用程序启动时准备环境的时候调用的。

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

yappi,Python性能分析库

yappi是为Python设计的线程感知型性能分析器,不仅支持CPU时间分析,还能够准确追踪线程级别的性能问题。 安装pip install yappi -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com基本用法import yappi import time import threadingdef func1()…

HTML4、HTML5 和 HTML6 之间的主要区别对比,以表格形式展示:

HTML4、HTML5 和 HTML6 之间的主要区别对比,以表格形式展示:特性 / 版本 HTML4 HTML5 HTML6 (预期)发布年份 1999 2014 尚未发布(预计未来发布)文档类型声明 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd…

Jenkins - 分布式构建

1 - 简介 Jenkins支持分布式多节点(Master-Slave)运行模式。将安装Jenkins的主机作为Master节点,然后通过界面配置(或远端启动服务)来添加Slave节点。在这种部署结构下,Master通常只充当管理者的角色,负责任务的调度,slave节点的管理,任务状态的收集等工作,具体的构建任…

Jenkins - 安装并启动Jenkins

1 - 关于Jenkins 构建流水线(build pipeline)工具Jenkins可以轻松地定义和管理各种各样的操作(构建、测试等),并将这些操作像管道pipe一样自由地进行组合,从而自动、流畅地执行一系列处理。将操作以项目project为单位整合并运行,操作简洁 消除手工操作,安全可靠 保留执…

Jenkins - 初识

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 通常企业都会将持续集成和持续交付的过程标准化一个单独的生态系统,将涉及的特定工具标…

10分钟搞懂大模型备案

大模型备案作为合规化运营的重要资质,办理难度大,申报周期长。为了方便大家快速弄懂大模型备案,我将大量涉及文件和繁杂的流程进行了精简和总结,力求让大家能快速理解重点。一、申报材料 大模型备案主要涉及语料安全评估、模型安全评估、安全措施评估三部分,主要申报材料如…

视频为什么会糊(二)?B站的码率变化

原文链接:https://tingxuanr.github.io/note/视频为什么会糊二b站的码率变化/ 摘要:流媒体平台(不只B站,所有流媒体都在干,画质最差的还得是优爱腾三家)为了节约成本,不断的降低自家视频的码率。很多所谓的4k、蓝光清晰度还不如六七年前的,纯粹是自欺欺人。上一篇对比 …

爬取二手房案例--parsel教学篇(CSS选择器)

本文通过一个爬取二手房的案例,来分享另外一种解析数据的方式:解析神器python第三方库parsel库。之所以叫他解析神奇,是因为它支持三种解析方式。 可以通过Xpath,CSS选择器和正则表达式来提取HTML或XML文档中的数据。@目录前言导航parsel的使用安装parsel创建Selector对象解…

duckX 读写word,替换word中内容的整理

一、库编译 1.下载地址:https://github.com/amiremohamadi/DuckX 2. 使用git 下载: git clone https://github.com/amiremohamadi/DuckX 3.编译 1.打开代码所在目录 2.创建生成目录build 3.依次点击 config generate 4. 打开项目,选择编译库的种类 生成库位置二、使用 C++读…

OpenAI 宕机思考丨Kubernetes 复杂度带来的服务发现系统的风险和应对措施

本文以社区主流服务发现系统 Nacos 为例,从可靠性、可伸缩性、高性能、可维护性等 4 个方面探讨如何提升 Kubernetes 中微服务应用的稳定性。作者:王建伟(正己) 12 月 11 日,OpenAI 旗下 AI 聊天机器人平台 ChatGPT、视频生成工具 Sora 及其面向开发人员的 API 自太平洋时…

如何删除www目录下无法删除的文件?

您好,有时在尝试删除www目录下的文件时,可能会遇到权限不足或其他问题导致无法删除。以下是详细的排查步骤和解决方案,帮助您顺利删除这些文件:检查文件权限:确认要删除的文件和目录具有适当的权限。可以通过FTP客户端或SSH连接到服务器并检查文件夹权限。例如:bashls -l…

请问忘记FTP账号密码,如何重置?

如果您忘记了FTP账号密码,可以通过以下几种方式重置密码,确保您的FTP账户能够正常使用:通过控制面板重置:大多数云服务提供商和托管平台都提供了在线控制面板,您可以在其中找到FTP管理选项。登录控制面板后,选择“FTP管理”或类似选项,然后点击“重置密码”。按照提示完…