本文来说下SpringBoot配置文件加载顺序
文章目录
概述
如果我们了解SpringBoot配置文件的加载顺序,对项目的开发和部署会有很大的帮助。举个工作中的例子,我们的项目是微服务架构模式,用Nacos做注册中心(可以配置每个微服务),所有服务请求需要通过网关,由网关做统一的鉴权和路由转发。环境有三套,本地环境、测试环境、网络环境。
每套环境都有自己的Nacos配置和数据库配置,难道我们每次打包到不同环境都有修改完配置文件再打包?开发的时候再一个一个改回来?答案当然是:No。
So,了解SpringBoot配置文件的加载顺序还是很有必要的。
Spring Boot的核心配置文件
SpringBoot 的核心配置文件有两个:
- bootstrap (.yml 或者 .properties)
- application (.yml 或者 .properties)
为什么需要这两个配置文件呢?合并成一个文件是否可以呢?那么大家是否清楚各自的使用场景呢?带着以上的这些问题,我们来一探究竟。
bootstrap/ application的区别
Spring Cloud构建于Spring Boot 之上,在Spring Boot中有两种上下文,一种是bootstrap, 另外一种是 application, bootstrap是应用程序的父上下文,也就是说 bootstrap加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
区别和联系
(1)、这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。
(2)、bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖,有例外。
(3)、bootstrap.yml(properties)和application.yml(properties)都可以用来配置参数。
(4)、boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
(5)、bootstrap可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
区别展开说明
加载顺序
若application.yml 和bootstrap.yml 在同一目录下:bootstrap.yml 先加载application.yml后加载。
bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父Spring ApplicationContext加载。
配置区别
bootstrap.yml 和application.yml 都可以用来配置参数。
bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。一旦bootStrap.yml 被加载,则内容不会被覆盖。
application.yml 可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
属性覆盖问题
启动上下文时,Spring Cloud 会创建一个 Bootstrap Context,作为 Spring 应用的 Application Context 的父上下文。
初始化的时候,Bootstrap Context 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment。Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。
也就是说如果加载的 application.yml 的内容标签与 bootstrap 的标签一致,application 也不会覆盖 bootstrap,而 application.yml 里面的内容可以动态替换。
bootstrap/ application应用场景
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
(1)使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
(2)一些固定的不能被覆盖的属性;
(3)一些加密/解密的场景;
本文小结
最后呢,给大家总结下重要的两点:
(1)核心的配置文件:bootstrap和application
(2)bootstrap优于application加载;bootstrap偏向系统层级的参数配置,application偏向应用层级的参数配置。