用不着下18层地狱-----现在就送你进入回调地狱

核心内容摘要

Zotero Better BibTeX:LaTeX文献管理痛点解决方案指南
低代码平台为何总在上线后崩?——Python内核级日志追踪、可观测性埋点与实时诊断系统搭建全链路

基于立创梁山派GD32F450与FM8002A功放的NES掌上游戏机DIY全攻略

文章目录

配置世界的权力金字塔

配置文件加载的具体顺序

1 配置文件位置的优先级

2 文件类型优先级

实战场景解析

1 单机应用配置加载实战

2 微服务场景下的配置加载

3 多环境配置处理

配置加载的底层原理

高级用法与最佳实践

1 自定义配置文件位置和名称

2 导入外部配置

3 属性覆盖策略理解

六、

常见问题与解决方案

1 配置属性不生效怎么办

2 如何确保敏感配置的安全

七、

总结参考资料深入理解配置的加载顺序让SpringBoot应用配置管理更得心应手你是否曾经遇到过这样的场景在配置文件中设置了一个参数但应用启动后却发现它没有按预期生效或者在生产环境中部署时某些配置莫名其妙被覆盖了这很可能是因为你没有完全掌握SpringBoot配置文件的加载顺序。

今天我们就来深入剖析SpringBoot配置文件的加载机制让你彻底理解这一重要主题。

配置世界的权力金字塔想象一下SpringBoot的配置系统就像一个公司的决策层级。

命令行参数是CEO拥有最高决定权系统环境变量是部门总监权力很大但还得听CEO的而项目内的配置文件则是基层员工虽然数量多但权力最小。

SpringBoot官方定义的配置优先级从高到低如下命令行参数如java -jar app.jar --server.port8081来自SPRING_APPLICATION_JSON的属性环境变量或系统属性中的JSON配置系统属性通过-D参数设置的值操作系统环境变量随机生成的属性如随机端口号应用配置文件application.properties或application.ymlConfiguration类中通过PropertySource注解定义的属性默认属性通过SpringApplication.setDefaultProperties指定简单来说离应用越近的配置方式优先级越低越外部、越临时的配置方式优先级越高。

这一设计理念确保了部署时的灵活性——你可以在不修改应用代码的情况下通过外部配置改变应用行为。

配置文件加载的具体顺序

1 配置文件位置的优先级当涉及到具体的配置文件时SpringBoot按照以下顺序加载优先级从高到低命令行中指定的配置文件通过--spring.config.location参数项目目录下的config子目录与jar包同级项目根目录与jar包同级类路径下的config包src/main/resources/config类路径根目录src/main/resources注意SpringBoot

2.

0之后版本调整了加载顺序将file:./config/*/提升至第一加载位置。

2 文件类型优先级在同一位置下如果存在多种类型的配置文件它们的优先级顺序为.properties.yml.yaml有趣的是虽然YAML文件在功能上更强大但在优先级方面却低于Properties文件。

这意味着当同一位置存在同名但不同后缀的配置文件时Properties文件中的配置会覆盖YAML文件中的配置。

实战场景解析

1 单机应用配置加载实战假设我们有一个简单的SpringBoot应用打包后为myapp.jar目录结构如下. ├── myapp.jar ├── application.propertiesserver.port8001 ├── config/ │ └── application.propertiesserver.port8002 └── src/main/resources/ ├── application.propertiesserver.port8003 └── config/ └── application.propertiesserver.port8004应用启动后最终生效的端口号是多少呢根据加载顺序外部config目录的优先级最高因此会使用config/application.properties中的配置即端口号为8002。

实战技巧将通用的配置放在jar包内部的配置文件中将环境相关的配置放在外部的配置文件中。

这样既保证了代码的可移植性又兼顾了部署的灵活性。

2 微服务场景下的配置加载在微服务架构中SpringBoot引入了bootstrap配置文件的概念。

这些配置文件主要用于应用程序上下文的引导阶段特别是从配置服务器加载配置时使用。

微服务场景下的加载顺序为bootstrap.ymlbootstrap.propertiesapplication.ymlapplication.properties为什么需要这种机制因为在微服务中应用需要先从配置中心获取必要的配置信息如连接数据库的凭据然后才能正常启动。

bootstrap配置文件正是为此而生。

3 多环境配置处理在实际开发中我们通常需要为不同环境开发、测试、生产提供不同的配置。

SpringBoot通过spring.profiles.active属性支持这一点。

假设有以下配置文件application.yml通用配置application-dev.yml开发环境配置application-prod.yml生产环境配置当使用--spring.profiles.activeprod启动应用时会加载application.yml和application-prod.yml且后者的配置会覆盖前者中的相同属性。

高级技巧可以同时激活多个profile例如--spring.profiles.activedev,db-mysql。

SpringBoot会按照从左到右的顺序加载配置右边的配置覆盖左边的配置。

配置加载的底层原理要真正理解配置加载顺序我们需要简单了解其底层机制。

SpringBoot启动时会初始化各种属性源PropertySource并把它们存放到Environment的propertySourceList中。

这个List是一个CopyOnWriteArrayList即线程安全的ArrayList。

当应用需要获取某个属性值时会按照propertySourceList的顺序从前往后查找一旦找到就立即返回。

这意味着在列表中位置靠前的属性源有更高的优先级。

有趣的是配置的加载顺序和生效顺序并不完全一致。

有些配置源虽然较早被加载但最终在propertySourceList中的位置可能较靠后因此优先级较低。

高级用法与最佳实践

1 自定义配置文件位置和名称如果你不想使用默认的application作为配置文件名可以通过spring.config.name属性自定义java -jar myapp.jar --spring.config.namemyconfig同样你也可以自定义配置文件的位置java -jar myapp.jar --spring.config.locationoptional:classpath:/config/,optional:file:./config/使用optional:前缀可以忽略文件不存在的错误防止因缺少配置文件而启动失败。

2 导入外部配置SpringBoot

2.

0及以上版本支持使用spring.config.import属性在配置文件中导入其他配置# application.ymlspring:config:import:-optional:file:.env[.properties]-configtree:/etc/config/这种机制允许你将配置分散到多个文件中提高配置的可维护性。

3 属性覆盖策略理解配置加载过程中的一个关键特性是高优先级配置会覆盖低优先级配置但不同配置会进行合并。

举个例子优先级高的配置文件中设置server.port8081优先级低的配置文件中设置server.servlet.context-path/api最终结果端口号为8081高优先级上下文路径为/api合并低优先级

六、

常见问题与解决方案

1 配置属性不生效怎么办当发现配置属性没有按预期生效时可以按照以下步骤排查检查属性名的拼写是否正确SpringBoot支持松散绑定但大小写和分隔符需一致确认配置所在文件的加载顺序使用--debug参数启动应用查看自动配置报告通过Environment端点如果已启用查看所有属性源及其值

2 如何确保敏感配置的安全对于密码、密钥等敏感配置建议不要将敏感信息提交到代码仓库使用外部配置文件或环境变量管理敏感数据考虑使用专业的配置管理工具如Spring Cloud Config、HashiCorp Vault等

七、

总结SpringBoot配置文件的加载顺序是一个看似简单实则复杂的主题。

通过本文的分析我们应该掌握以下核心要点优先级原则外部配置优于内部配置临时配置优于持久配置覆盖策略高优先级配置覆盖低优先级配置不重复的配置内容会合并微服务差异微服务环境中bootstrap配置文件先于application配置文件加载设计理念SpringBoot的配置系统设计体现了约定优于配置的理念同时为特殊需求提供了足够的灵活性正确理解配置加载顺序不仅能避免常见的配置问题还能让我们更好地规划应用配置结构提高开发和部署效率。

希望本文能帮助你彻底掌握SpringBoot配置文件的加载机制。

如果你有任何问题或独到见解欢迎在评论区留言讨论参考资料https://www.cfanz.cn/resource/detail/OmoRXmGJmzVkLhttps://blog.csdn.net/m0_73257876/article/details/126673993https://blog.51cto.com/u_15905482/5920082https://cloud.tencent.com/developer/article/2442107https://www.womengda.net/nav/java/

htmlhttps://blog.csdn.net/zzhongcy/article/details/107200796https://blog.51cto.com/u_16542656/11731229https://blog.csdn.net/weixin_39855568/article/details/111739922

爱液视频直接进入-爱液视频直接进入应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123