建设电商网站流程,江门网页建站模板,长沙网站制作收费明细表,网站设计软件培训怎么样#x1f4da; 一、为什么需要了解配置文件优先级#xff1f;
想象一下#xff0c;你正在玩一个游戏#x1f3ae;#xff0c;游戏里有默认设置#xff0c;但你可以通过不同的方式修改这些设置#xff1a;
游戏内置的默认设置#xff08;就像Spring Boot的默认配置 一、为什么需要了解配置文件优先级
想象一下你正在玩一个游戏游戏里有默认设置但你可以通过不同的方式修改这些设置
游戏内置的默认设置就像Spring Boot的默认配置全局配置文件就像游戏的设置菜单特定场景的特殊设置就像某个关卡的特殊规则
Spring Boot的配置文件也是这样层层叠加的理解它们的优先级你就能像游戏高手一样精准控制应用的行为了 二、Spring Boot配置文件全家福
Spring Boot支持多种格式的配置文件主要有 .properties文件传统格式 server.port8080.yml或.yaml文件更简洁的格式 server:port: 8080环境变量 命令行参数
这些配置可以同时存在那Spring Boot怎么决定用哪个呢这就是优先级的奥秘啦 三、配置文件优先级完整排行榜
来啦来啦最关键的优先级排行榜从高到低依次是 命令行参数 王者级别 java -jar myapp.jar --server.port9090来自java:comp/env的JNDI属性 (不太常用) Java系统属性(System.getProperties()) java -Dserver.port9090 -jar myapp.jar操作系统环境变量 export SERVER_PORT9090仅在打包的jar外部的特定profile的应用配置文件 application-{profile}.properties或application-{profile}.yml放在jar包同目录下的config子目录中 仅在打包的jar外部的特定profile的应用配置文件 直接放在jar包同目录下 打包在jar内的特定profile的应用配置文件 也就是resources目录下的application-{profile}.properties或yml 打包的jar外部的应用配置文件 application.properties或application.yml放在jar包同目录下的config子目录中 打包的jar外部的应用配置文件 直接放在jar包同目录下 打包在jar内的应用配置文件 也就是resources目录下的application.properties或yml Configuration类上的PropertySource注解 ️ PropertySource(classpath:custom.properties)SpringApplication.setDefaultProperties设置的默认属性
哇是不是有点多别担心我们慢慢来分解理解~ 四、实际应用场景解析
场景1开发环境 vs 生产环境
假设我们有一个数据库配置 默认配置 (application.yml) spring:datasource:url: jdbc:mysql://localhost:3306/dev_dbusername: dev_userpassword: dev_pass生产环境配置 (application-prod.yml) spring:datasource:url: jdbc:mysql://prod-server:3306/prod_dbusername: prod_userpassword: ${DB_PASSWORD} # 从环境变量获取启动时使用
java -jar app.jar --spring.profiles.activeprod这样生产环境就会自动使用生产配置啦
场景2临时覆盖配置
有时候我们需要临时修改某个配置比如端口号
java -jar app.jar --server.port9090这样命令行参数会覆盖所有文件中的配置超级方便✨ 五、深度解析属性覆盖机制
Spring Boot使用一个叫PropertySource的抽象概念来管理这些配置。当需要获取一个属性值时它会按照优先级顺序查找找到第一个匹配的就停止。
举个 假设在application.yml中 server:port: 8080同时在环境变量中设置了 export SERVER_PORT9090启动命令 java -jar app.jar --server.port7070最终端口会是哪个呢没错是7070因为命令行参数优先级最高
️ 六、如何正确覆盖配置最佳实践
1. 多环境配置
推荐使用profile机制
# application.yml
spring:profiles:active: dev # 默认使用dev环境# application-dev.yml (开发环境)
server:port: 8080# application-prod.yml (生产环境)
server:port: 80启动时指定profile
java -jar app.jar --spring.profiles.activeprod2. 敏感信息处理
千万不要把密码等敏感信息直接写在配置文件中♂️
推荐做法
spring:datasource:password: ${DB_PASSWORD}然后通过环境变量设置
export DB_PASSWORDmysecretpassword3. 外部化配置
把配置文件放在jar包外面方便修改
.
├── app.jar
├── config
│ └── application.yml
└── application.yml这样修改配置不需要重新打包 七、高级技巧自定义属性源
如果你想玩点高级的可以实现自己的PropertySource
public class CustomPropertySource extends PropertySource {public CustomPropertySource() {super(customPropertySource);}Overridepublic Object getProperty(String name) {if (custom.property.equals(name)) {return 我是自定义属性值;}return null;}
}然后在配置类中注册
Configuration
public class AppConfig {Autowiredprivate ConfigurableEnvironment env;PostConstructpublic void init() {env.getPropertySources().addAfter(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,new CustomPropertySource());}
}这样你就可以用Value(${custom.property})获取自定义属性啦✨ 八、调试技巧查看实际生效的配置
想知道最终生效的配置是什么有几种方法 Actuator端点 (如果引入了actuator) http://localhost:8080/actuator/env启动时打印 在application.yml中添加 logging:level:org.springframework.boot.context.properties: DEBUG编程方式获取 Autowired
private Environment env;public void someMethod() {String port env.getProperty(server.port);System.out.println(实际端口: port);
}九、常见问题与解决方案
Q1: 我的配置修改了为什么不生效
A: 按照以下步骤检查
确认修改的文件在优先级更高的位置检查是否有拼写错误确认没有更高优先级的配置覆盖了它检查profile是否激活正确
Q2: yml和properties文件哪个优先级高
A: 如果同名.properties优先级高于.yml。但最好统一使用一种格式。
Q3: 如何禁用某个配置文件的加载
A: 使用
java -jar app.jar --spring.config.locationoptional:file:/path/to/config/Q4: 配置属性名中的横线(-)和下划线(_)有什么区别
A: Spring Boot会自动将my.property-name和my.property_name视为相同属性方便使用。 十、实战演练完整示例
让我们通过一个完整例子巩固所学 项目结构 src/main/resources/application.yml # 默认配置application-dev.yml # 开发环境application-prod.yml # 生产环境
target/myapp.jar
config/application.yml # 外部覆盖配置application.yml spring:profiles:active: dev
app:name: MyAppversion: 1.0.0application-dev.yml server:port: 8080
db:url: jdbc:mysql://localhost:3306/devapplication-prod.yml server:port: 80
db:url: jdbc:mysql://prod-server:3306/prodconfig/application.yml (外部配置) app:version: 1.0.1 # 覆盖版本号启动命令 java -jar myapp.jar --spring.profiles.activeprod --server.port9090最终生效的配置 server.port: 9090 (命令行参数最高)app.name: MyApp (默认配置)app.version: 1.0.1 (外部配置覆盖)db.url: jdbc:mysql://prod-server:3306/prod (prod profile)
完美现在你完全掌握了配置覆盖的艺术 十一、总结配置优先级核心要点
让我们用一张表格总结关键点
优先级配置来源示例适用场景最高命令行参数--server.port9090临时测试、运维调整↑环境变量export SERVER_PORT9090容器部署、敏感信息↑外部配置文件/config/application.yml生产环境配置↓jar内配置文件resources/application.yml默认配置、开发环境最低默认属性SpringApplication.setDefaultProperties框架默认值
记住这个口诀“命环外jar默认”命令行环境变量外部文件jar内文件默认️ 十二、BonusSpring Boot 2.4配置新特性
如果你使用Spring Boot 2.4及以上版本还有一些新玩法 配置文件分组 spring:profiles:group:production: db,redis启动production相当于同时激活db和redis profile 导入额外配置 spring:config:import: optional:file:/path/to/config/多文档YAML文件 可以在一个yml文件中用---分隔多个profile配置 十三、举一反三其他相关知识点
理解了配置优先级这些相关概念也更容易掌握 Value注解直接从环境获取属性值 Value(${server.port})
private int port;ConfigurationProperties类型安全的配置绑定 ConfigurationProperties(prefix app)
public class AppProperties {private String name;private String version;// getters/setters
}Spring Cloud Config集中式配置管理 十四、延伸阅读推荐
想更深入学习的同学可以参考
Spring Boot官方文档 - 外部化配置《Spring Boot实战》 - 第3章 自定义配置《Spring微服务实战》 - 配置管理章节 十五、结语
恭喜你 现在你已经完全掌握了Spring Boot配置文件优先级的精髓记住
理解优先级层次是关键 合理使用profile管理多环境 敏感信息用环境变量保护 外部化配置让运维更灵活 ️
如果有任何问题欢迎在评论区留言讨论哦 我们下次再见
Happy Coding! ✨
推荐阅读文章 由 Spring 静态注入引发的一个线上T0级别事故真的以后得避坑 如何理解 HTTP 是无状态的以及它与 Cookie 和 Session 之间的联系 HTTP、HTTPS、Cookie 和 Session 之间的关系 什么是 Cookie简单介绍与使用方法 什么是 Session如何应用 使用 Spring 框架构建 MVC 应用程序初学者教程 有缺陷的 Java 代码Java 开发人员最常犯的 10 大错误 如何理解应用 Java 多线程与并发编程 把握Java泛型的艺术协变、逆变与不可变性一网打尽 Java Spring 中常用的 PostConstruct 注解使用总结 如何理解线程安全这个概念 理解 Java 桥接方法 Spring 整合嵌入式 Tomcat 容器 Tomcat 如何加载 SpringMVC 组件 “在什么情况下类需要实现 Serializable什么情况下又不需要一” “避免序列化灾难掌握实现 Serializable 的真相二” 如何自定义一个自己的 Spring Boot Starter 组件从入门到实践 解密 Redis如何通过 IO 多路复用征服高并发挑战 线程 vs 虚拟线程深入理解及区别 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别 10大程序员提升代码优雅度的必杀技瞬间让你成为团队宠儿 “打破重复代码的魔咒使用 Function 接口在 Java 8 中实现优雅重构” Java 中消除 If-else 技巧总结 线程池的核心参数配置(仅供参考) 【人工智能】聊聊Transformer深度学习的一股清流(13) Java 枚举的几个常用技巧你可以试着用用 由 Spring 静态注入引发的一个线上T0级别事故真的以后得避坑 如何理解 HTTP 是无状态的以及它与 Cookie 和 Session 之间的联系 HTTP、HTTPS、Cookie 和 Session 之间的关系 使用 Spring 框架构建 MVC 应用程序初学者教程 有缺陷的 Java 代码Java 开发人员最常犯的 10 大错误 Java Spring 中常用的 PostConstruct 注解使用总结 线程 vs 虚拟线程深入理解及区别 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别 10大程序员提升代码优雅度的必杀技瞬间让你成为团队宠儿 探索 Lombok 的 Builder 和 SuperBuilder避坑指南一 为什么用了 Builder 反而报错深入理解 Lombok 的“暗坑”与解决方案二