springboot是如何做到根据配置的 spring profile 值来决定引用不同环境的application.yml 配置文件的?
Spring Boot通过使用Spring框架的Profile功能,实现了根据配置的Spring Profile值来决定引用不同环境的application.yml
配置文件。
在Spring Boot中,可以通过在application.yml
文件中定义多个配置块,并使用spring.profiles
属性来指定每个配置块所对应的Profile。例如:
spring:
profiles: dev
上述示例中,dev
表示一个名为dev
的Profile。
当启动Spring Boot应用程序时,会根据以下规则来加载配置文件:
- 首先,会加载默认的
application.yml
配置文件,其中不包含任何Profile相关的配置。 - 然后,根据
spring.profiles.active
属性的值(可以通过命令行参数、系统属性或环境变量进行设置),确定当前激活的Profile。如果未指定,则默认使用default
作为激活的Profile。 - 最后,根据激活的Profile,加载带有相应Profile标记的配置块。例如,如果激活的Profile是
dev
,则会加载所有带有spring.profiles: dev
标记的配置块。
这样,通过合理设置spring.profiles.active
属性的值,就可以自动加载对应环境的配置文件。例如,如果将spring.profiles.active
设置为dev
,则会加载所有带有spring.profiles: dev
标记的配置块的配置。
结合源码拆解下步骤
当我们在Spring Boot应用程序中配置了多个application.yml
文件,并使用Profile值来区分它们时,Spring Boot会按照以下步骤来加载相应的配置:
-
Spring Boot 首先加载默认的
application.yml
配置文件。这是由于在Spring Boot中,application.yml
是默认的配置文件名,会自动加载。 -
接下来,Spring Boot会检查
spring.profiles.active
属性的值,以确定当前激活的Profile。该属性可以通过不同的方式进行设置,包括命令行参数、系统属性或环境变量。 -
当检测到激活的Profile后,Spring Boot会加载对应Profile标记的配置块。具体来说,它会查找带有
spring.profiles: <profile>
的配置块,并将其与默认配置合并。 -
配置文件的加载是通过Spring的
PropertySourceLoader
接口和PropertySourceLoaderUtils
工具类完成的。在PropertySourceLoader
接口的实现类中,Spring Boot提供了许多常用的加载器,如YamlPropertySourceLoader
用于加载YAML格式的配置文件。 -
最终,所有配置文件都会被解析成
PropertySource
对象,并注册到Spring的Environment
中,使得应用程序能够方便地获取配置属性。
为了更好地理解上述过程,我们来看一下Spring Boot源码中的实现。
首先,在SpringApplication
类中,会调用SpringApplication#load
方法来加载配置文件。在该方法中,会获取所有配置文件的资源路径,并使用PropertySourceLoaderUtils
工具类将它们转换为PropertySource
对象集合。
然后,在SpringApplication#configureProfileEnvironment
方法中,会根据spring.profiles.active
属性的值来激活对应的Profile,并将其设置到Spring的Environment
中。这个过程通过Profiles#of
方法来实现。
接着,在PropertySourceLoaderUtils
类中的load()
方法中,会遍历所有的PropertySourceLoader
接口实现类,尝试使用不同的加载器来解析配置文件。一旦找到匹配的加载器,就会使用该加载器将配置文件解析成PropertySource
对象,并添加到PropertySources
中。
最后,当所有的配置文件都被解析成PropertySource
对象后,Spring Boot会将这些对象添加到Environment
中,使得应用程序能够通过@Value
注解或使用Environment
对象来获取配置属性。
总结起来,Spring Boot通过加载默认的application.yml
配置文件,并根据激活的Profile值来加载相应的配置块,最终将所有的配置文件解析成PropertySource
对象,并注册到Spring的Environment
中,以实现根据Profile值来决定引用不同环境的配置文件。
+-----------------------+
| |
| SpringApplication |
| |
+--+----------------+---+
| |
load() | | configureProfileEnvironment()
+---------------+ | | +----------------+
| | | | | |
| Property +-------+ Environment +--------+ Profiles |
| Sources | | | | |
| | | | +----------------+
+-------+-------+ | |
| | |
| | |
+--------v-------+ | |
| | | |
| PropertySource | | |
| Loader +-------+ |
| | |
+----------------+ |
|
|
+------------------------v-----------------------+
| |
| Default `application.yml` Configuration |
| |
+---------+-------------------+------------------+
| |
| |
+-----------v-----+ +------v-----------+
| | | |
| Profile: default| | Profile: active |
| | | |
+-----------------+ +------------------+
Configuration Configuration
for default profile for active profile
标签:profile,Profile,配置文件,spring,Boot,Spring,原理,加载
From: https://www.cnblogs.com/shamo89/p/17502675.html