将属性配置放在 application.yml 或 bootstrap.yml 上有什么区别?
共 2308字,需浏览 5分钟
·
2024-12-05 07:16
你知道的越多,不知道的就越多,业余的像一棵小草!
你关注,我们一起精进!你星标,我们便有了更多故事!
编辑:业余草
推荐:https://t.zsxq.com/VNife
将属性配置放在 application.yml 或 bootstrap.yml 上有什么区别?
这个问题的背景是微信群里一位网友在面试中被问到了,当时他回答的不是很好,今天和群友交流了起来。我刚好看到了,就讲了几句。这里结合国外的一些程序员回答思路,分享给大家。
注意,stackoverflow 上也有和本题一样的一个高赞问题,看起来国外程序员也有搞不懂这个问题的。
首先要了解一点,bootstrap.yml 是优先于 application.yml 加载的。
其次,我们再分两种情况来看。
-
一种是 SpringBoot 模式下,属性配置在 application.yml 或 bootstrap.yml 中,差别是不大的。 -
另一种是在 SpringCloud 模式下,使用 Spring Cloud Config Server 时,应在 bootstrap.yml 中指定 spring.application.name 和 spring.cloud.config.server.git.uri、spring.cloud.config.uri。
从技术实现上来讲,bootstrap.yml
由 parent Spring 加载 ApplicationContext。该父级 ApplicationContext 在使用之前会加载application.yml
。
说白了,就是在使用 Spring Cloud 时,“真实”配置数据通常从服务器加载。为了获取 URL(以及其他连接配置,例如密码等),您需要一个早期或“引导”配置。因此,我们需要将配置的服务器属性放在 bootstrap.yml 中,该文件用于加载真实配置数据,通常会覆盖 application.yml 中的内容(如果存在)。
引导文件永远不会被覆盖,因为它具有更高的优先级。
bootstrap.yml 和 bootstrap.properties。仅当我们使用 Spring Cloud 并且应用程序的配置存储在远程配置服务器(例如 Spring Cloud Config Server)上时才会使用/需要它。当然,如果在 SpringBoot 项目中,完全不使用 application.yml 配置文件,只使用 bootstrap.yml 也是可以的。此时的 bootstrap.yml 和 application.yml 是等价的。
bootstrap.yml 或 bootstrap.properties 也可以包含其他配置(例如默认值),但通常只需要在此处放置引导配置。如果你加入了其它配置,也是可以的。但这样,就会使引导配置文件膨胀起来。
牢记约定大于配置。另外,再给某些类、文件添加东西时,应该首先考虑做减法,减轻该类或文件的负担。如果确定添加的内容是合理的,符合单一原则的,再做加法。
我不知道上面的内容,大家有没有完全理解。下面我简单总结一下。
-
bootstrap.yml 优先级更高,比 application.yml 高 -
application.yml 通常使用与 SpringCloud 项目 -
application.yml 属于 SpringBoot 的配置,bootstrap.yml 可以理解为属于 SpringCloud 的配置 -
bootstrap.yml 用于从服务器获取配置 -
如果从服务器获取到了配置,会覆盖 application.yml 中的配置,如果存在的话 -
如果是 k8s 环境( spring-cloud-starter-kubernetes
),bootstrap.yml 的另一个用途是从 kubernetes configmap 和 secret 资源加载配置。 -
bootstrap.yml 可以说是启动 Spring Boot 或启动 Spring Cloud 应用程序时加载的第一个文件。application.yml 是当前应用程序启动时加载的。
参考资料
-
https://docs.spring.io/spring-cloud-config/docs/current/reference/html/ -
https://stackoverflow.com/questions/32997352/what-is-the-difference-between-putting-a-property-on-application-yml-or-bootstra