在 Spring Boot 项目中,bootstrap.yml
和 application.yml
都可以用来配置应用的属性,但它们在加载顺序和优先级上有区别。
加载顺序和优先级
-
bootstrap.yml
:此文件在 Spring Boot 应用启动时最早被加载,通常用于配置引导上下文(Bootstrap Context),例如云原生配置(如 Spring Cloud Config)以及其他早期启动时需要的配置。 -
application.yml
:此文件在引导上下文初始化完成后被加载,用于常规的应用配置。
当 bootstrap.yml
和 application.yml
中都配置了相同的属性(如 server.port
),Spring Boot 会遵循一定的优先级规则来决定使用哪一个配置值。
配置优先级规则
Spring Boot 配置源的优先级如下(从高到低):
- 命令行参数 (
--server.port=8080
) -
application.properties
或application.yml
(位于当前目录或 classpath 下) -
bootstrap.properties
或bootstrap.yml
(位于当前目录或 classpath 下) -
application.properties
或application.yml
(位于file:./config/
目录下) -
bootstrap.properties
或bootstrap.yml
(位于file:./config/
目录下) -
@Configuration
类上的@PropertySource
-
jar
包内application.properties
或application.yml
-
jar
包内bootstrap.properties
或bootstrap.yml
-
spring.config.location
属性指定的配置文件 - 默认属性
对于 server.port
的具体行为
如果 bootstrap.yml
和 application.yml
中都配置了 server.port
,那么按照上述优先级规则:
- 如果
bootstrap.yml
和application.yml
都位于相同的优先级位置,那么application.yml
中的配置将会覆盖bootstrap.yml
中的配置。 - 如果
bootstrap.yml
和application.yml
位于不同的位置(例如,bootstrap.yml
在classpath:/config/
而application.yml
在当前目录),那么位置优先级更高的application.yml
文件中的配置会被使用。
示例
假设 bootstrap.yml
和 application.yml
都位于 classpath:/
下,并且配置如下:
bootstrap.yml:
server:
port: 8081
application.yml:
server:
port: 8080
在这种情况下,application.yml
中的 server.port
配置将会覆盖 bootstrap.yml
中的配置,最终应用的端口将是 8080
。
实际应用建议
为了减少配置冲突和便于管理,建议遵循以下原则:
- 使用
bootstrap.yml
配置早期启动需要的属性:例如 Spring Cloud Config 服务器地址等。 - 使用
application.yml
配置常规应用属性:例如端口、数据库连接等。
通过这种方式,可以清晰地区分不同配置文件的作用,并减少不必要的冲突。如果确实需要覆盖某个配置项,可以使用更高优先级的配置文件或命令行参数来实现。