Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringApplication Run方法核心逻辑

SpringApplication Run方法核心逻辑

作者头像
技术从心
发布于 2021-02-03 04:02:35
发布于 2021-02-03 04:02:35
66600
代码可运行
举报
文章被收录于专栏:技术从心技术从心
运行总次数:0
代码可运行

run方法逻辑

在上一篇文章中,我们看到SpringApplication的静态方法最终是去构造了一个SpringApplication实例对象,并调用了SpringApplication的成员方法run

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    return new SpringApplication(primarySources).run(args);
}

本文将梳理一下run方法的代码主要的逻辑,为后面其它内容做一个铺垫

跟进run方法,这个方法的代码有点长我们将抛弃掉一些比较次要的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ConfigurableApplicationContext run(String... args) {
    // 声明一个Context容器
    ConfigurableApplicationContext context = null;
    // 获取监听器
    SpringApplicationRunListeners listeners = getRunListeners(args);
    // 调用监听器的启动
    listeners.starting();

    try {
        // 创建并配置Environment(这个过程会加载application配置文件)
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        // 根据应用类型创建对应的Context容器
        context = createApplicationContext();

        // 刷新Context容器之前的准备
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        // 刷新Context容器
        refreshContext(context);
        // 刷新Context容器之后处理
        afterRefresh(context, applicationArguments);

        // Context容器refresh完毕发布
        listeners.started(context);

        // 触发Context容器refresh完以后的执行
        callRunners(context, applicationArguments);
    } catch (Throwable ex) {}

    try {
        // Context启动完毕,Runner运行完毕发布
        listeners.running(context);
    } catch (Throwable ex) {}

    return context;
}

简化后的代码看起来就比较清晰了,我们再整理一下逻辑

1)首先会从spring.factories配置文件中获取SpringApplicationRunListener监听器并启动监听器;

2)而后就会去创建Environment

3)紧接着创建ApplicationContext

4)ApplicationContext的refresh的事前准备

5)ApplicationContext的refresh

6)ApplicationContext的refresh之后

7)发布ApplicationContext的refresh完毕的事件

8)触发runner

9)最后发布refresh完毕、runner执行完毕的事件

run方法描述了SpringApplication这个类的职责,包含了不少步骤,但简单的看其实就是为了创建并配置好一个ApplicationContext。

总结

我们忽略各种细节以后就会发现,SpringApplication的run方法主要就是为了构建出一个ApplicationContext,后续文章也将围绕着构建ApplicationContext相关的内容展开。

参考 https://www.cnblogs.com/lay2017

我是“一生”,一个在国企苟且偷生的打工人,下期再见。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
可能是全网最全的SpringBoot启动流程源码分析(最新3.x版本)
静态辅助类,可用于运行使用默认配置(即我们添加的一系列注解)的指定源的 SpringApplication 。
JavaEdge
2020/05/26
1.9K0
可能是全网最全的SpringBoot启动流程源码分析(最新3.x版本)
SpringBoot源码核心源码讲解
  我们要分析一个框架的源码不可能通过一篇文章就搞定的,本文我们就来分析下SpringBoot源码中的主线流程。先掌握SpringBoot项目启动的核心操作,然后我们再深入每一个具体的实现细节,注:本系列源码都以SpringBoot2.2.5.RELEASE版本来讲解
用户4919348
2022/01/07
1.5K0
SpringBoot源码核心源码讲解
springboot源码解析详细版
来看下 createApplicationContext() 方法的源码: 作用:
全栈程序员站长
2022/08/14
7890
从 SpringApplication 认识 Spring 应用启动过程
BootstrapRegistryInitializer:回调接口,用于 BootstrapRegistry 初始化。
WindWant
2023/06/18
6410
【框架源码】SpringBoot核心源码解读之启动类源码分析
首先我们要先带着我们的疑问,spring boot是如何启动应用程序?去分析SpringBoot的启动源码。
互联网小阿祥
2023/05/28
5920
【框架源码】SpringBoot核心源码解读之启动类源码分析
深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!
Spring Boot的配置类;标注在某个类上,表示一个类提供了Spring Boot应用程序
全栈程序员站长
2022/09/06
6070
深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!
SpringBoot 是如何动起来的
调用SpringApplication.java 中的 run 方法,目的是加载Spring Application,同时返回 ApplicationContext。
JavaFish
2019/10/17
4540
SpringBoot启动流程大揭秘
日常开发中采用的是开源的若依框架,也就是SpringBoot框架,那么什么是SpringBoot框架呢? SpringBoot是一款开箱即用框架,提供各种默认配置来简化项目配置,让我们的Spring应用变的更轻量化、更快的入门,在主程序执行main函数就可以运行,也可以打包你的应用为jar并通过使用java -jar来运行你的Web应用。 使用SpringBoot只需很少的配置,大部分的时候直接使用默认的配置即可。同时后续也可以与Spring Cloud的微服务无缝结合。
六月的雨在Tencent
2024/03/29
1450
SpringBoot启动流程大揭秘
SpringBoot是如何动起来的
对应的就是 META-INF/spring.factories 文件中的 org.springframework.boot.SpringApplicationRunListener=org.springframework.boot.context.event.EventPublishingRunListener
云扬四海
2019/06/05
4180
聊聊springboot的启动事件
org/springframework/boot/context/event/SpringApplicationEvent.java
code4it
2023/08/31
2320
聊聊springboot的启动事件
SpringApplication 深入探索
对于第一个注解 @SpringBootApplication,我已经讲解了。接下来就是深入探究第二个了 SpringApplication.run() 。
botkenni
2022/05/06
4970
SpringApplication 深入探索
三分钟了解 SpringBoot 的启动流程
最近有位开发同学说面试被问到Spring Boot 的启动流程,以及被问到Spring Boot 的嵌入式Web容器是什么时候加载的。如何加载的。是怎么无缝切换的。
一行Java
2023/12/19
3420
三分钟了解 SpringBoot 的启动流程
Spring Boot启动加载顺序详解
Spring Boot应用的启动过程看似简单,但其中涉及了复杂的初始化和加载机制。本文将深入剖析Spring Boot的启动流程,了解其自动配置、引导启动和源码运行等 every detail。
司夜
2023/08/23
4.4K0
Spring Boot启动加载顺序详解
SpringBoot启动流程原理解析(二)
return new SpringApplication(primarySources).run(args); 这篇文章咱么说下run()方法开始之后都做了那些事情。 继续往下跟着源码进入到run()这个是比较核心的一个方法了
程序员波特
2024/01/19
2390
SpringBoot启动流程原理解析(二)
从SpringBootApplication谈谈Spring Boot启动时都做了哪些事?
Spring Boot 极大的减少了我们Spring项目开发的工作量,很多的配置文件往往都不需要编写了,只需要引入对应的starter,就可以完成配置实例的自动装配。那么,在Spring Boot项目执行时,到底都做了哪些事呢?
架构探险之道
2020/01/13
1.7K0
从SpringBootApplication谈谈Spring Boot启动时都做了哪些事?
Spring Boot - ApplicationRunner && CommandLineRunner扩展接口
如果有多个CommandLineRunner,可以利用@Order来进行排序, 按照@Order中的value值从小到大依次执行。
小小工匠
2022/12/09
7620
Spring Boot - ApplicationRunner && CommandLineRunner扩展接口
Spring Boot(6) 原理和启动流程四、ApplicationContextInitializer、ApplicationContextAware、ApplicationContext、App
SpringBoot是一个快速开发框架,目的是解放java程序猿的生产力,提高开发效率。主要特点: 1、整合依赖:通过Maven,快速的将一些常用的第三方依赖整合。 2、简化配置:简化XML配置,全部采用注解形式。 3、集成web容器:内置Http服务器(Jetty和Tomcat),最终以java应用程序进行执行。 简化Spring应用的创建、运行、调试、部署的工作,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。
黄规速
2022/04/14
1.7K0
Spring Boot(6) 原理和启动流程四、ApplicationContextInitializer、ApplicationContextAware、ApplicationContext、App
Spring Boot - Application Events 的发布顺序_ApplicationPreparedEvent
Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent
小小工匠
2024/01/13
3570
Spring Boot - Application Events 的发布顺序_ApplicationPreparedEvent
Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent
Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦,使得应用程序中的不同组件可以独立地改变和复用逻辑,而无需直接进行通信。
小小工匠
2024/01/12
3310
Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent
聊聊springboot的启动事件
org/springframework/boot/context/event/SpringApplicationEvent.java
code4it
2023/08/25
2470
推荐阅读
相关推荐
可能是全网最全的SpringBoot启动流程源码分析(最新3.x版本)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档