首页 > 其他分享 >spring profile 原理

spring profile 原理

时间:2023-06-25 13:12:14浏览次数:29  
标签:profile Profile 配置文件 spring Boot Spring 原理 加载

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
 

标签:profile,Profile,配置文件,spring,Boot,Spring,原理,加载
From: https://www.cnblogs.com/shamo89/p/17502675.html

相关文章

  • 时速云使用 Higress 替换 Ngnix Ingress + Spring Cloud Gateway 的生产实践
    作者:王金山,北京云思畅想科技有限公司技术部微服务架构师,负责公司API网关和服务网格等研发工作时速云介绍时速云成立于2014年10月,致力于通过云原生技术帮助企业实现数字化转型,拥有云原生应用平台TCAP和云原生数据平台KubeData两大核心产品体系,产品包含云原生DevOps、容器......
  • Spring和Spring MVC中的常用注解
    spring中的常用注解@Compontent:表示这是spring管理的一个组件@Controller:控制层的组件@Service:业务层的组件@Repository:持久层组件@Autoeire:自动装配注解@Qualifier:Autowired默认是根据类型进行注入的,Qualifier限定描述符除了能根据名字进行注入,更能进行更细粒度的控制如......
  • 字节码原理浅析 —— 基于栈的执行引擎
    字节码是运行在JVM上的,为了能弄懂字节码,需要对JVM的运行原理有所了解。这篇文章将以栈帧为切入点理解字节码在JVM上执行的细节。虚拟机虚拟机常见的实现方式有两种:Stackbased的和Registerbased。比如基于Stack的虚拟机有HotspotJVM、.netCLR,这种基于Stack实现......
  • 产品读书《金字塔原理》
    PPT参考 1PPT参考2其实我读这本书并不是把它当作一本读物来读,反倒觉得像是一本工具书,全书的内容可能干货不多,总结出来就是“金字塔”,倒没什么其他,再多也就是一些案例!但是这个思想已经能让人俯首称赞了!拜读一下吧!目录作者介绍导读核心内容第一部分:表达的逻辑 1为什么要用金字塔结......
  • 【转】SpringBoot 线上服务假死,CPU 内存正常
    文章来源:blog.csdn.net/zhangcongyi420/article/details/1311395991、背景开发小伙伴都知道线上服务挂掉,基本都是因为cpu或者内存不足,出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 2、问题排查老规矩在集群环境中同一个服务......
  • HashMap的工作原理
    HashMap的工作原理(图文+例子)详解,绝对简单通俗易懂 目录什么是HashMap?HashMap的内部结构内部结构之数组内部结构之链表Put方法与Get方法原理JDK1.7月JDK1.8中HashMap的区别什么是HashMap?基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用nu......
  • spring源码笔记
    Bean创建流程获取对象的BeanDefinition通过反射创建空对象填充属性调用init方法  Bean创建关键方法(按顺序)getBeandoGetBeancreateBeandoCreateBeancreateBeanInstancepopulateBean  解决循环依赖:三级缓存循环依赖原因单例,每个类只有一个对象。A引用B,B又......
  • spring-boot-maven-plugin插件详解
    一、为什么SpringBoot项目自带这个插件当我们在SpringBoot官方下载一个脚手架时,会发现pom.xml会自带spring-boot-maven-plugin插件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2......
  • 11.springboot 原理 ( 起步依赖-自动配置)
    springboot原理springframeworkspringboot(配置起步依赖-自动配置)spring-boot-starter-web起步依赖(其他依赖自动传递)自动配置原理:自动将内置类存入IOC容器中,不用收到配置,只能扫描包内即子包的类,可以指定扫描的包内容:@ComponentScan("com.alex","com.ite");@Import导......
  • SpringCloud学习(三)
    微服务应用参考:https://blog.csdn.net/qq_25928447/article/details/124198071?spm=1001.2014.3001.5501分布式权限校验回顾之前进行权限校验的原理,服务器是如何判定一个请求是来自哪个用户的:首先浏览器会向服务端发送请求,访问网站。服务端收到请求后,会创建一个SESSION......