spring profile 原理

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应用程序时,会根据以下规则来加载配置文件:

  1. 首先,会加载默认的application.yml配置文件,其中不包含任何Profile相关的配置。
  2. 然后,根据spring.profiles.active属性的值(可以通过命令行参数、系统属性或环境变量进行设置),确定当前激活的Profile。如果未指定,则默认使用default作为激活的Profile。
  3. 最后,根据激活的Profile,加载带有相应Profile标记的配置块。例如,如果激活的Profile是dev,则会加载所有带有spring.profiles: dev标记的配置块。

这样,通过合理设置spring.profiles.active属性的值,就可以自动加载对应环境的配置文件。例如,如果将spring.profiles.active设置为dev,则会加载所有带有spring.profiles: dev标记的配置块的配置。

 

结合源码拆解下步骤

 

当我们在Spring Boot应用程序中配置了多个application.yml文件,并使用Profile值来区分它们时,Spring Boot会按照以下步骤来加载相应的配置:

  1. Spring Boot 首先加载默认的application.yml配置文件。这是由于在Spring Boot中,application.yml是默认的配置文件名,会自动加载。

  2. 接下来,Spring Boot会检查spring.profiles.active属性的值,以确定当前激活的Profile。该属性可以通过不同的方式进行设置,包括命令行参数、系统属性或环境变量。

  3. 当检测到激活的Profile后,Spring Boot会加载对应Profile标记的配置块。具体来说,它会查找带有spring.profiles: <profile>的配置块,并将其与默认配置合并。

  4. 配置文件的加载是通过Spring的PropertySourceLoader接口PropertySourceLoaderUtils工具类完成的。在PropertySourceLoader接口的实现类中,Spring Boot提供了许多常用的加载器,如YamlPropertySourceLoader用于加载YAML格式的配置文件。

  5. 最终,所有配置文件都会被解析成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
 
posted @   夏威夷8080  阅读(197)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示