摘要:Spring Boot 的配置参数优先级规则定义了当多个来源都尝试设置同一个配置属性时,哪个来源的配置会生效。理解这些规则对于有效地配置 Spring Boot 应用程序至关重要,尤其是在复杂的部署环境中。
Spring Boot 的配置参数优先级规则定义了当多个来源都尝试设置同一个配置属性时,哪个来源的配置会生效。理解这些规则对于有效地配置 Spring Boot 应用程序至关重要,尤其是在复杂的部署环境中。
Spring Boot 遵循一套明确的优先级顺序来加载和应用配置参数。优先级越高,来源的配置就越优先被使用,会覆盖优先级较低来源的配置。
以下是 Spring Boot 配置参数的优先级顺序,从最高优先级到最低优先级排列:
1. 命令行参数 (Command-line arguments)
优先级最高。通过命令行启动应用程序时传递的参数,例如:--server.port=9000-Dspring.profiles.active=dev (Java 系统属性形式)命令行参数可以直接覆盖其他所有来源的配置。适用于快速修改和测试,或者在部署时根据环境动态配置。2. Java 系统属性 (Java System Properties)
优先级次高。通过 -D 参数在命令行中设置的 Java 系统属性,例如:-Dserver.port=8081-Dspring.config.location=classpath:/custom-config/可以通过 System.getProperty 在代码中访问。适用于设置 JVM 级别的配置,或者在启动脚本中统一管理配置。3. 操作系统环境变量 (OS Environment Variables)
优先级第三高。操作系统级别的环境变量,例如 SERVER_PORT=8082。Spring Boot 会将环境变量名转换为属性名,通常是将大写字母转换为小写,并用点号 . 分隔单词。例如,SERVER_PORT 对应 server.port。适用于在不同环境(开发、测试、生产)中配置不同的参数,而无需修改应用程序代码或配置文件。4. application-{profile}.properties 或 application-{profile}.yml (Profile-specific application configuration files)
优先级第四高。特定 profile 的配置文件,例如 application-dev.properties、application-prod.yml。当激活对应的 profile 时,这些配置文件会被加载。适用于为不同环境或场景提供不同的配置,例如开发环境使用 H2 数据库,生产环境使用 MySQL 数据库。Profile 可以通过 spring.profiles.active 属性激活,可以通过命令行参数、系统属性、环境变量或默认配置文件设置。5. application.properties 或 application.yml (Default application configuration files)
优先级第五高。默认的应用程序配置文件,通常位于 src/main/resources 目录下。当没有激活特定 profile 或没有找到 profile-specific 配置文件时,会加载默认配置文件。适用于设置应用程序的默认配置。6. @ConfigurationProperties 注解的 Bean (Configuration properties annotated with @ConfigurationProperties)
优先级第六高。使用 @ConfigurationProperties 注解的 Java Bean,通过绑定配置文件中的属性来配置 Bean 的属性。这些 Bean 的配置通常来源于配置文件,但也可以被更高优先级的来源覆盖。适用于将配置属性组织成结构化的 Bean,方便代码中使用。7. 默认属性 (Default properties)
优先级最低。Spring Boot 框架和第三方库提供的默认属性值。如果没有在任何其他来源中配置属性,则会使用默认值。确保应用程序在没有显式配置的情况下也能正常运行。命令行参数Java 系统属性操作系统环境变量Profile-specific application configuration files (application-{profile}.properties 或 application-{profile}.yml)Default application configuration files (application.properties 或 application.yml)@ConfigurationProperties 注解的 Bean默认属性重要注意事项:
配置文件加载顺序: 在同等优先级下,例如多个 application.properties 文件,Spring Boot 也会有加载顺序。通常情况下,以下顺序会被考虑:classpath:/config/ 目录下的配置文件classpath:/ 目录下的配置文件file:./config/ 目录下的配置文件file:./ 目录下的配置文件优先级高的目录下的配置文件会覆盖优先级低的目录下的同名属性。@PropertySource 注解: @PropertySource 注解可以用来加载额外的属性文件,但其优先级通常低于 application.properties 和 application.yml。外部化配置: Spring Boot 鼓励使用外部化配置,即将配置信息放在应用程序代码之外,方便部署和管理。命令行参数、环境变量和外部配置文件都是外部化配置的常见方式。调试配置: Spring Boot Actuator 提供了 /configprops 端点,可以查看当前应用程序加载的所有配置属性及其来源,方便调试配置问题。灵活性: 允许在不同环境和场景下灵活地配置应用程序,而无需修改代码。可维护性: 将配置信息与代码分离,提高代码的可维护性和可重用性。部署便捷性: 方便在不同的部署环境中进行配置,例如通过环境变量或命令行参数进行配置。调试方便性: 清晰的优先级规则有助于理解配置来源和解决配置冲突问题。掌握 Spring Boot 的配置参数优先级规则,可以帮助你更好地管理和配置你的应用程序,使其适应各种不同的环境和需求。
来源:小杨科技每日一讲