bootstrap.yml和application.yml
省流:均本地文件时,application.yml会覆盖bootstrap.yml中的同名属性;外部配置中心时,不会覆盖。
--- 正文 ---
在Spring Boot和Spring Cloud应用中,如果同时在bootstrap.yml
和application.yml
中配置了数据库连接,那么最终运行时使用的配置会依赖于属性源的加载顺序和优先级。
加载顺序和优先级
-
bootstrap.yml
优先:
bootstrap.yml
文件中的配置属性会先于application.yml
文件加载。这是因为bootstrap.yml
在应用程序上下文的初始化过程中最早被处理,用于配置一些需要在应用程序启动前就初始化的属性。这主要包括从外部配置中心加载的配置等。 -
application.yml
次优先:
application.yml
文件中的配置属性在bootstrap.yml
之后加载。如果application.yml
中声明了与bootstrap.yml
中相同的配置属性,application.yml
中的值将会覆盖bootstrap.yml
中的值。
覆盖规则
简单来说,application.yml
中的配置会覆盖 bootstrap.yml
中的同名配置属性,因此如果你在这两个文件中都配置了数据库连接,最终的生效配置将会是 application.yml
中的配置。
例子
假设 bootstrap.yml
中配置了如下内容:
spring:
datasource:
url: jdbc:mysql://localhost:3306/bootstrapdb
username: bootstrapUser
password: bootstrapPass
而 application.yml
中配置了如下内容:
spring:
datasource:
url: jdbc:mysql://localhost:3306/applicationdb
username: applicationUser
password: applicationPass
最终在应用程序运行时,会使用 application.yml
中的数据库连接配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/applicationdb
username: applicationUser
password: applicationPass
特殊情况:外部配置中心
需要特别注意的是,当使用外部配置中心(例如 Spring Cloud Config Server)时,通常会将某些配置(例如数据库连接)从配置中心加载。在这种情况下:
bootstrap.yml
中配置的是外部配置中心的地址和参数,而非具体的数据库连接参数。- 真正的数据库连接参数从配置中心加载,并且其优先级高于
application.yml
。
注意事项
- 避免混淆:尽量避免在
bootstrap.yml
和application.yml
中同时配置相同的属性,以避免混淆和难以调试的问题。 - 文档化:对团队成员进行关于配置文件加载顺序和优先级的培训,并且将其记录在项目的文档中,以确保在多人合作时具有一致的理解。
通过理解和合理设置这两种配置文件,可使你的Spring Boot应用程序配置更清晰、可维护。