首页 > 其他分享 >SpringBoot- 启动原理(下)

SpringBoot- 启动原理(下)

时间:2024-09-06 11:39:04浏览次数:5  
标签:Web SpringBoot 启动 Spring bootstrapContext 应用程序 SpringApplication 原理

SpringBoot系列- 启动原理(下)

   从上一篇文章《SpringBoot系列-启动原理(上)》中,介绍了SpringBoot应用启动的核心方法run()的整体情况。这篇文章来详细展开介绍。其中比较重要的方法会标记上***

   1. createBootstrapContext

   DefaultBootstrapContext bootstrapContext = createBootstrapContext();

   1. SpringApplication#createBootstrapContext方法:

1    private DefaultBootstrapContext createBootstrapContext() {
2      DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext();
3      this.bootstrapRegistryInitializers.forEach((initializer) -> initializer.initialize(bootstrapContext));
4      return bootstrapContext;
5    }

   DefaultBootstrapContext 是 Spring Boot 2.4 版本引入的,它是用来提供应用启动时的一些早期引导操作。它允许在创建 ApplicationContext 之前,提前加载和初始化某些关键组件或资源。这对于某些在启动时需要提前初始化的场景非常重要,例如:

  • 配置属性源的初始化(如 Environment 配置)
  • 提供一些应用启动时的依赖资源(如外部配置文件、网络服务的连接等)

   2. bootstrapContext 与 applicationContext 的区别:

   1) bootstrapContext

   bootstrapContext 是在 applicationContext 之前的一个轻量级上下文,它不会管理 bean 的生命周期,也不会处理依赖注入等常规操作。它主要用于在应用上下文完全初始化前,提前处理一些启动相关的任务。

   2) applicationContext

   applicationContext 是完整的 Spring 容器,用于管理应用的 bean 生命周期、依赖注入、事件驱动等。

   二、getRunListeners
从 spring.factories文件中加载 SpringApplicationRunListener 的接口实现类
SpringApplicationRunListeners listeners = this.getRunListeners(args);

 

    SpringApplication#getRunListeners 方法:

1 private SpringApplicationRunListeners getRunListeners(String[] args) {
2 
3    Class<?>[] types = new Class[]{SpringApplication.class, String[].class};
4 
5    // 通过该方法 getSpringFactoriesInstances 指定 SpringApplicationRunListener 类型来加载的
6   // 注意下参数 this 就是当前的 SpringApplication 对象,用于获取监听器集合
7    return new SpringApplicationRunListeners(logger, this.getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args), this.applicationStartup);
8 }

 

3. starting
listeners.starting(bootstrapContext, this.mainApplicationClass);

4. prepareEnvironment

5. printBanner

   六、createApplicationContext

   context = this.createApplicationContext();

   根据应用程序的类型,创建相应的ApplicationContext实例

   1. SpringApplication#createApplicationContext()

1 protected ConfigurableApplicationContext createApplicationContext() {
4     return this.applicationContextFactory.create(this.webApplicationType);
8 }

   2.  WebApplicationType 枚举类

1 public enum WebApplicationType {
2    NONE,
3    SERVLET,
4    REACTIVE;
5    //...
6 }

   WebApplicationType 是 Spring Boot 中的一个枚举类,用于表示应用程序的类型,即 Spring Boot 应用程序的运行环境类型。这个枚举类在 Spring Boot 启动时用于确定应用程序是 Web 应用程序(如 MVC、WebFlux), 还是非 Web 应用程序(如命令行工具)。它主要有以下三种类型:

   1) NONE:  非 Web 应用(CLI、批处理等)。这种类型的应用程序不需要嵌入式的 Web 服务器,如 Tomcat、Jetty、Undertow 等。

   2) SERVLET: 基于 Servlet 的传统 Web 应用(如使用 Spring MVC)。此类型的应用程序需要嵌入式的 Web 服务器,并且支持 Spring MVC 来处理 HTTP 请求。

   3) REACTIVE: 基于反应式编程模型的 Web 应用(如使用 Spring WebFlux)。

  七、 prepareContext 准备应用上下文

  this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);

这一步主要是在容器刷新之前的准备动作。包含一个非常关键的操作:将启动类注入容器,为后续开启自动化配置奠定基础。
// 调用Spring的refresh方法
8. refreshContext
this.refreshContext(context);
9. afterRefresh

应用上下文刷新之后的事件的处理

public class SpringApplication {

public ConfigurableApplicationContext run(String... args) {

//...
this.afterRefresh(context, applicationArguments);

}

//扩展接口,设计模式中的模板方法,默认为空实现。
//如果有自定义需求,可以重写该方法。比如打印一些启动结束log,或者一些其它后置处理
protected void afterRefresh(ConfigurableApplicationContext context, ApplicationArguments args) {
}
}

 

标签:Web,SpringBoot,启动,Spring,bootstrapContext,应用程序,SpringApplication,原理
From: https://www.cnblogs.com/hld123/p/18399925

相关文章

  • springboot社区医院管理系统
     基于springboot+vue实现的社区医院管理系统(源码+L文+ppt)4-0514系统总体设计  此次社区医院管理系统通过springboot框架。springboot适合快速构建Web应用。springboot将B/S设计模式中的视图分成了View模块和Template模块两部分,将动态的逻辑处理交给View处理,页面通过T......
  • springboot社区医院管理系统
     基于springboot+vue实现的社区医院管理系统(源码+L文+ppt)4-0514系统总体设计  此次社区医院管理系统通过springboot框架。springboot适合快速构建Web应用。springboot将B/S设计模式中的视图分成了View模块和Template模块两部分,将动态的逻辑处理交给View处理,页面通过T......
  • 【Java】【SpringBoot】yml配置文件解析
    yml的常见配置可以详见官方文档。https://docs.spring.io/spring-boot/appendix/application-properties/index.html#appendix.application-properties.server服务器配置server:port:8080#端口servlet:context-path:/#应用程序上下文路径【设置访问路径前缀......
  • 小皮出现80端口被System占用以及Mysql服务无法启动的解决方法
    80端口被System占用的解决方法80端口一般被当做网页服务器的默认端口,使用本机搭建服务器环境的时候,都会默认使用80端口来作为网页访问端,但是有的时候80端口会被其他程序占用,导致Apache启动失败。下面介绍一下如果80端口被占用后应该如何处理。经过查询,发现占用80端口的确是......
  • 记一次阿里云搭建K8S在恢复镜像快照之后etcd一个节点无法启动问题
    环境查看系统环境#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)#uname-aLinuxCentOS7K8SMaster010051013.10.0-1160.114.2.el7.x86_64#1SMPWedMar2015:54:52UTC2024x86_64x86_64x86_64GNU/Linux软件环境#kubectlversionClientVe......
  • linux启动流程
    KASLRkerneladdressspacelayoutrandomization内核地址空间布局随机化本质是将链接的地址做了随机偏移,这样System.map中的地址也不一样了,需要用cat/proc/kallsyms才能查看到实际的地址。主要还是为了安全,这样地址布局随机化,来增加安全,被攻击的难度会增加。防止利用内......
  • Spring、SpringMVC、SpringBoot都是什么,有什么区别
    Spring、SpringMVC、SpringBoot都是什么,有什么区别Spring:是一个轻量级的基于IOC和AOP的容器框架,是用来简化开发流程的一套框架。IOC:InversionofController控制反转。不好理解的概念:应用不负责依赖对象的创建,而是把它们创建的控制器交给外部容器,这种控制权的转移就是控......
  • LDO的原理及测试方法
    一、基本结构这是LM317芯片的核心,这个电路单元称为BandgapReference带隙基准源。属于模拟集成电路中的经典电路结构。LDO拓扑结构图常见的基本结构利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS))。二、测试意义......
  • springboot美容院管理系统
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统实现管理员功能实现美容部位管理实现管理员权限的美容部位管理功能,其运行......
  • 基于springboot的“衣依”服装销售平台的设计与实现
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统详细实现管理员模块的实现商品信息管理“衣依”服装销售平台的系统管理员......