省流:均本地文件时,application.yml会覆盖bootstrap.yml中的同名属性;外部配置中心时,不会覆盖。

--- 正文 ---

在Spring Boot和Spring Cloud应用中,如果同时在bootstrap.ymlapplication.yml中配置了数据库连接,那么最终运行时使用的配置会依赖于属性源的加载顺序和优先级。

加载顺序和优先级

  1. bootstrap.yml 优先
    bootstrap.yml 文件中的配置属性会先于 application.yml 文件加载。这是因为 bootstrap.yml 在应用程序上下文的初始化过程中最早被处理,用于配置一些需要在应用程序启动前就初始化的属性。这主要包括从外部配置中心加载的配置等。

  2. 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)时,通常会将某些配置(例如数据库连接)从配置中心加载。在这种情况下:

  1. bootstrap.yml 中配置的是外部配置中心的地址和参数,而非具体的数据库连接参数。
  2. 真正的数据库连接参数从配置中心加载,并且其优先级高于 application.yml

注意事项

  1. 避免混淆:尽量避免在 bootstrap.ymlapplication.yml 中同时配置相同的属性,以避免混淆和难以调试的问题。
  2. 文档化:对团队成员进行关于配置文件加载顺序和优先级的培训,并且将其记录在项目的文档中,以确保在多人合作时具有一致的理解。

通过理解和合理设置这两种配置文件,可使你的Spring Boot应用程序配置更清晰、可维护。