SpringBoot源码分析之bootstrap.properties文件加载的原理

目录
  • 1.bootstrap的使用
  • 2.bootstrap加载原理分析
    • 2.1 BootstrapApplicationListener
    • 2.2 启动流程梳理
    • 2.3 bootstrap.properties的加载原理

  对于SpringBoot中的属性文件相信大家在工作中用的是比较多的,对于application.properties和application.yml文件应该非常熟悉,但是对于bootstrap.properties文件和bootstrap.yml这个两个文件用的估计就比较少了,用过的应该清楚bootstrap.properties中定义的文件信息会先与application.properties中的信息加载。而且大家在使用的时候还经常碰到获取不到bootstrap.properties中定义的信息的困扰,本文就来给大家揭开这些谜团。

1.bootstrap的使用

  首先在SpringBoot中默认是不支持bootstrap.properties属性文件的。我们需要映入SpringCloud的依赖才可以。

相关的版本环境

然后创建对应的bootstrap.properties文件,当然你也可以创建bootstrap.yml文件

同步的我们也会创建application.properties文件,其中会覆盖一个属性

然后我们在controller中获取测试

访问测试:http://localhost:8080/query

通过访问看到bootstrap.properties中的信息获取到了,同时age也被application.properties中的属性覆盖掉了。加载顺序到底是什么?为什么会覆盖呢?我们接下来分析。

2.bootstrap加载原理分析

  看本文之前最好看下我前面讲解的SpringBoot中的监听机制。

2.1 BootstrapApplicationListener

  在使用bootstrap.properties文件时我们需要映入相关的依赖

  其实在这个依赖中会在对应的spring.factories文件中给我们提供新的监听器,也就是BootstrapApplicationListener监听器。

  而BootstrapApplicationListener监听触发的事件是ApplicationEnvironmentPreparedEvent事件,这个事件其实和我们前面介绍监听application.properties的时候的监听器ConfigFileApplicationListener监听的是同一个事件。

  如果你看了前面的文章,那么此处你会觉得有点眉目了。也就是当启动的时候发布对应的事件,该监听器会触发相关的解析行为。

2.2 启动流程梳理

  搞清楚了监听器的关系后,我们来看下启动的流程代码具体是怎么执行的。

直接进入

在SpringApplication的构造方法中我们要注意两点,1.监听器的加载 2.main方法的主类记录

然后回来进入run方法

Debug到第一个端点。

然后我们放过。

通过上面的动图可以看到又进入了一次这个run方法。先看处理的结果。

然后我们再放过,继续

分两次加载,有先右后哦。那么这里面的第一个加载的原理到底是什么呢?继续来分析。

2.3 bootstrap.properties的加载原理

  接下来看看是如果出现的一个父context来优先加载我们的bootstrap.properteis文件的,还是从这个图开始

链路如上面一步步跟踪即可。

跳过非关键的,直接进入到BootstrapApplicationListener中来看。

然后进入到 bootstrapServiceContext方法中。

这儿我们看到有创建了一个SpringApplication对象。这个其实就是父Context对象了。

进入run方法你会发现,回到了前面

到这应该就清楚了执行的核心流程了,至于是如何加载的属性文件的内容,参考我的上篇文章哦。

到此这篇关于SpringBoot源码分析之bootstrap.properties文件加载的原理的文章就介绍到这了,更多相关SpringBoot源码分析文件加载的原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springBoot如何动态加载资源文件

    目录 springBoot动态加载资源文件 构造DynamicLoadPropertySource 添加到Enviroment springBoot静态资源动态加载 举例说明 springBoot动态加载资源文件 在实际项目中资源信息如果能够动态获取在修改线上产品配置时极其方便,下面来展示一个加载动态获取资源的案例,而不是加载写死的properties文件信息. 首先构造PropertySource,然后将其添加到Enviroment中. 构造DynamicLoadPropertySource

  • springboot启动不加载bootstrap.yml文件的问题

    目录 springboot启动不加载bootstrap.yml文件 无法识别 bootstrap.yml 小绿叶问题 错误信息 问题定位 解决 springboot启动不加载bootstrap.yml文件 使用nacos做配置中心,但是程序启动失败,没有拉取配置中心的配置信息. 检查之后发现是bootstrap.yml文件没有被加载,在项目的pom.xml文件中添加如下依赖,可能需要添加版本号,具体版本号可以去maven仓库查询,我使用的是 3.0.1版本. <dependency> <

  • SpringBoot项目实战之加载和读取资源文件

    目录 通过Resource接口 手动加载 通过@Value自动转换 通过ResourceLoader加载 使用ResourceUtils加载资源 读取资源中的内容 通过File对象读取 通过InputStream对象读取 文末总结 本文聊一聊在 SpringBoot 应用中,访问加载类路径(classpath)中的文件内容的多种方法. 通过Resource接口 Resource接口抽象出一种更底层的方式管理资源,可以实现通过统一的方式处理各类文件资源.下面是几种获取资源实例的方法. 手动加载 访

  • SpringBoot不读取bootstrap.yml/properties文件问题

    目录 今天写创建了一个SpringBoot项目,配置文件从其他项目拷贝了一份bootstrap.yml 之前一直用的application.yml 心想:application.yml 优先级没有bootstrap.yml 高,bootstrap配置文件肯定没问题 项目一跑来,发现配置文件里面的内容没读取到. 之后通过各种查资料,才明白了application.yml 和bootstrap.yml 的区别,不仅仅是优先级的问题. 先说我的问题是什么原因吧: SpringBoot 项目中如果没有依

  • Springboot常用注解及配置文件加载顺序详解

    Springboot常用注解及底层实现 1.@SpringBootApplication:这个注解标识了一个SpringBoot工程,她实际上是另外三个注解的组合,分别是: @SpringBootConfiguration:源码可以看到,这个注解除了元注解外,实际就只有一个@Configuration,把该类变成一个配置类,表示启动类也是一个配置类: @EnableAutoConfiguration:是开启自动配置的功能,向Spring容器中导入了一个Selector,用来加载ClassPath

  • SpringBoot源码分析之bootstrap.properties文件加载的原理

    目录 1.bootstrap的使用 2.bootstrap加载原理分析 2.1 BootstrapApplicationListener 2.2 启动流程梳理 2.3 bootstrap.properties的加载原理   对于SpringBoot中的属性文件相信大家在工作中用的是比较多的,对于application.properties和application.yml文件应该非常熟悉,但是对于bootstrap.properties文件和bootstrap.yml这个两个文件用的估计就比较少了

  • 从java源码分析线程池(池化技术)的实现原理

    目录 线程池的起源 线程池的定义和使用 方案一:Executors(仅做了解,推荐使用方案二) 方案二:ThreadPoolExecutor 线程池的实现原理 前言: 线程池是一个非常重要的知识点,也是池化技术的一个典型应用,相信很多人都有使用线程池的经历,但是对于线程池的实现原理大家都了解吗?本篇文章我们将深入线程池源码来一探究竟. 线程池的起源 背景: 随着计算机硬件的升级换代,使我们的软件具备多线程执行任务的能力.当我们在进行多线程编程时,就需要创建线程,如果说程序并发很高的话,我们会创建

  • mybatis源码解读之executor包懒加载功能 

    ProxyFactory是创建代理类的工厂接口,其中的setProperties方法用来对工厂进行属性设置,但是mybatis内置的两个实现类都没有实现该接口,所以不支持属性设置.createProxy方法用来创建一个代理对象 public interface ProxyFactory {   // 设置工厂属性   default void setProperties(Properties properties) {   }   // 创建代理对象   Object createProxy(O

  • java中Properties文件加载和使用方法

    一.Properties简介 Properties 类继承自HashTable,提供的方法很像Map的实现类HashMap.它在 Java 编程的早期就有了,并且几乎没有什么变化.J2SE 的 Tiger 版本增强了这个类,不仅可以用它在单独一行中指定用等号分隔的多个键-值对(其中键和值是用等号分隔的),还可以用XML 文件装载和保存这些键-值对. 二.Properties 的加载和简单的使用 1.路径存放 2.信息配置 name = Lily age = 22 3.简单的加载和使用 packa

  • seajs1.3.0源码解析之module依赖有序加载

    这里是seajs loader的核心部分,有些IE兼容的部分还不是很明白,主要是理解各个模块如何依赖有序加载,以及CMD规范. 代码有点长,需要耐心看: 复制代码 代码如下: /** * The core of loader */ ;(function(seajs, util, config) { // 模块缓存 var cachedModules = {} // 接口修改缓存 var cachedModifiers = {} // 编译队列 var compileStack = [] // 模

  • SpringBoot拦截器与文件上传实现方法与源码分析

    目录 一.拦截器 1.创建一个拦截器 2.配置拦截器 二.拦截器原理 三.文件上传 四.文件上传流程 一.拦截器 拦截器我们之前在springmvc已经做过介绍了 大家可以看下[SpringMVC]自定义拦截器和过滤器 为什么在这里还要再讲一遍呢? 因为spring boot里面对它做了简化,大大节省了我们配置那些烦人的xml文件的时间 接下来,我们就通过一个小例子来了解一下拦截器在spring boot中的使用 1.创建一个拦截器 首先我们创建一个拦截器,实现HandlerIntercepto

  • Springboot 2使用外部Tomcat源码分析

    Springboot 使用外部 Tomcat 1.修改 pom.xml,改为打 war 包 <packaging>war</packaging> 2.将 Springboot 内置 tomcat 作用域改为provided <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifac

  • SpringBoot源码剖析之属性文件加载原理

    目录 前言 1.找到入口 2.ConfigFileApplicationListener 2.1 主要流程分析 2.2 Loader构造器 2.3 properties加载 总结 前言 首先我们来看一个问题.就是我们在创建SpringBoot项目的时候会在对应的application.properties或者application.yml文件中添加对应的属性信息,我们的问题是这些属性文件是什么时候被加载的?如果要实现自定义的属性文件怎么来实现呢?本文来给大家揭晓答案: 1.找到入口 结合我们前面

  • 使用dynamic datasource springboot starter实现多数据源及源码分析

    目录 简介 实操 基本使用 集成druid连接池 service嵌套 为什么切换数据源不生效或事务不生效? 源码分析 整体结构 自动配置怎么实现的 如何集成众多连接池的 DS注解如何被拦截处理的 多数据源动态切换及如何管理多数据源 数据组的负载均衡怎么做的 如何自定义数据配置来源 如何动态增减数据源 总结 简介 前两篇博客介绍了用基本的方式做多数据源,可以应对一般的情况,但是遇到一些复杂的情况就需要扩展下功能了,比如:动态增减数据源.数据源分组,纯粹多库 读写分离 一主多从.从其他数据库或者配置

  • 详解SpringBoot启动代码和自动装配源码分析

    目录 一.SpringBoot启动代码主线分析 二.SpringBoot自动装配原理分析 1.自动装配的前置知识@Import 2.@SpringApplication注解分析 2.1@SpringBootConfiguration 2.2@EnableAutoConfiguration ​随着互联网的快速发展,各种组件层出不穷,需要框架集成的组件越来越多.每一种组件与Spring容器整合需要实现相关代码.SpringMVC框架配置由于太过于繁琐和依赖XML文件:为了方便快速集成第三方组件和减少

随机推荐