复杂知识简单学 Springboot加载配置文件源码分析

本文详细探讨了Springboot如何通过ConfigFileApplicationListener加载application.yml等配置文件。核心在于postProcessEnvironment方法,该方法处理Environment,将配置文件内容放入其中。加载过程涉及RandomValuePropertySource、Loader类的load方法、FilteredPropertySource以及PropertiesPropertySourceLoader和YamlPropertySourceLoader。配置文件的搜索路径和名称可通过getSearchLocations()和getSearchNames()定制,默认在多个路径下查找application配置。不同profile的加载规则和bean过滤由ProfileCondition控制,所有配置最终存储于Environment。
摘要由CSDN通过智能技术生成

Springboot 加载配置文件源码分析

本文的分析是基于springboot 2.2.0.RELEASE。

springboot加载配置文件如application.yml是通过org.springframework.boot.context.config.ConfigFileApplicationListener这个类来完成的。这个类的加载也是通过spring.factories文件中来加载的。

复杂知识简单学!Springboot加载配置文件源码分析

ConfigFileApplicationListener这个类同时实现了EnvironmentPostProcessor、ApplicationListener这两个接口。

EnvironmentPostProcessor接口需要实现的postProcessEnvironment方法,这个方法主要就是用来对Environment来进行增强处理的。而Environment主要是用来表示当前应用程序运行环境的接口。在我们这里来说读取的配置文件最终也会放到这里面来。


简单的调用关系就是下面的图来,具体是怎么调到onApplicationEvent的,比较简单,就不和大家一起看了。直接看本次的重点吧。

下面的方法都是ConfigFileApplicationListener这个类中

image.png


在addPropertySources中首先会添加一个用来处理生成随机数的RandomValuePropertySource,然后就会通过内部类Loader来加载配置文件。所以我们本次的主要是看Loader类的load方法的执行流程

复杂知识简单学!Springboot加载配置文件源码分析

下面我们来具体看看load方法的执行流程

		void load() {      //配置文件的加载就是通过这里来完成的。      //DEFAULT_PROPERTIES = "defaultProperties";      //LOAD_FILTERED_PROPERTY是一个set<String>,里面有两个元素{"spring.profiles.active","spring.profiles.include"}			FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY,         //下面这里是一个lambda表达式,这里暂时省略,后面具体调用到这里我们再具体看。 对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):1253431195【教程/工具/方法/解疑】 

                        					(defaultProperties) -> {						......					});		}

上面的会调用到FilteredPropertySource的静态方法,这个也比较简单,就几行代码。最终又会调用到上面我们的省略的lambda表达式

static void apply(ConfigurableEnvironment environment, String propertySourceName, Set<String> filteredProperties,      Consumer<PropertySource<?>> operation) {   //这个是获取到当前程序的运行时环境。主要就是当前系统的环境变量、当前程序的环境变量等等,下面放个图一起看看      MutablePropertySources propertySources = environment.getPropertySources();  //这里是从运行时环境中查找key=defaultProperties的属性值,一般情况下,我们没有配置这个属性,获取到的original就是null,就会走到下面的if分支中,回到我们的lambda表达式中,我们就看这个分支吧   PropertySource<?> original = propertySources.get(propertySourceName);   if (original == null) {      operation.accept(null);      return;   }   propertySources.replace(propertySourceName, new FilteredPropertySource(original, filteredProperties));   try {      operation.accept(original);   }   finally {      propertySources.replace(propertySourceName, original);   }}

我们看看上面的MutablePropertySources propertySources = environment.getPropertySources();里面的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开源的Java框架,用于构建独立的、可执行的、生产级的Spring应用程序。它提供了一个快速、简单的方式来开发和部署应用程序。而在Spring Boot的启动过程中,有以下几个主要的步骤: 1. 加载启动类:Spring Boot应用程序的启动类通常是一个带有`@SpringBootApplication`注解的Java类。在应用程序启动时,会通过`main`方法加载这个启动类。 2. 创建Spring Application对象:Spring Boot会创建一个`SpringApplication`对象,用于启动应用程序。`SpringApplication`是Spring Boot框架的核心类,它负责管理整个应用程序的生命周期。 3. 解析配置信息:在启动过程中,`SpringApplication`会解析`application.properties`或`application.yaml`文件中的配置信息,并将其加载Spring环境中。这些配置信息可以用来配置应用程序的各个方面,如数据库连接、日志级别等。 4. 创建并配置Spring容器:Spring Boot使用Spring容器来管理应用程序中的各个Bean。在启动过程中,`SpringApplication`会根据配置信息创建并配置一个Spring容器,该容器负责加载和管理应用程序中的所有Bean。 5. 执行自定义逻辑:在Spring Boot的启动过程中,可以添加自定义的逻辑。例如,可以通过实现`CommandLineRunner`接口来在应用程序启动后执行一些初始化操作。 6. 启动应用程序:完成上述步骤后,`SpringApplication`会启动应用程序,并通过Servlet容器(如Tomcat、Jetty等)监听端口,开始接收和处理HTTP请求。 总体而言,Spring Boot的启动流程是一个通过加载启动类、解析配置信息、创建和配置Spring容器的过程。通过Spring Boot的自动配置和快速启动能力,开发者可以更加方便地构建和部署Spring应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值