Spring Boot中application.yml和bootstrap.yml的区别

Spring Boot中application.yml和bootstrap.yml的区别

技术背景

在Spring Boot开发中,配置文件对于应用的启动和运行至关重要。application.ymlbootstrap.yml是两种常见的配置文件,它们在加载顺序、使用场景等方面存在差异,了解这些差异有助于我们更好地管理应用的配置。

实现步骤

1. 加载顺序

bootstrap.yml会在application.yml之前被加载。bootstrap.yml由父Spring ApplicationContext加载,而使用application.yml的ApplicationContext是在之后加载的。

2. 使用场景

  • bootstrap.yml:仅在使用Spring Cloud且应用的配置存储在远程配置服务器(如Spring Cloud Config Server)时使用。通常包含配置服务器的位置(spring.cloud.config.uri)和应用的名称(spring.application.name)。启动时,Spring Cloud会使用这些信息向配置服务器发起HTTP调用,获取应用的配置。
  • application.yml:包含标准的应用配置,通常是默认配置,因为在引导过程中从远程配置服务器获取的任何配置都将覆盖这里定义的配置。

核心代码

bootstrap.yml示例

1
2
3
4
5
6
spring:
application:
name: "application-name"
cloud:
config:
uri: "http://config-server-url"

application.yml示例

1
2
3
4
5
6
7
8
spring:
application:
name: foobar
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/test
server:
port: 9000

最佳实践

  • 如果使用Spring Cloud Config Server,将spring.application.namespring.cloud.config.uri放在bootstrap.yml中,以确保在应用启动时能够正确连接到配置服务器获取配置。
  • 将通用的、默认的配置放在application.yml中,而将与远程配置服务器相关的配置放在bootstrap.yml中。

常见问题

1. 为什么Config Server需要将参数放在bootstrap.yml中?

当使用Spring Cloud时,“真实”的配置数据通常从服务器加载。为了获取配置服务器的URL(以及其他连接配置,如密码等),需要一个更早的“引导”配置。因此,将配置服务器的属性放在bootstrap.yml中,用于加载真实的配置数据,这些数据通常会覆盖application.yml中的配置(如果存在)。

2. 为什么移除application.yml后,应用不读取bootstrap.yml?

一般情况下,bootstrap.yml会正常加载,若出现不读取的情况,可能是项目配置或依赖存在问题,需要检查Spring Cloud相关依赖是否正确引入,以及配置文件路径和命名是否正确。

3. bootstrap.yml中的属性优先级如何?

bootstrap.yml中用于引导阶段加载配置文件的属性具有较高的优先级,不能被本地配置覆盖;而bootstrap.yml中普通的属性优先级较低,低于包括application.yml在内的其他属性源。


Spring Boot中application.yml和bootstrap.yml的区别
https://119291.xyz/posts/2025-04-22.difference-between-application-yml-and-bootstrap-yml-in-spring-boot/
作者
ww
发布于
2025年4月22日
许可协议