Spring Boot源码分析一:启动流程

1. 引言

SpringBoot是一个广泛使用的Java框架,旨在简化基于Spring框架的应用程序的开发过程。在这篇文章中,我们将深入探讨SpringBoot应用程序的启动流程,了解其背后的机制。

2. Spring Boot 启动概览

SpringBoot应用程序的启动通常从一个包含 main 方法的类开始,例如:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

这里的SpringApplication.run是启动SpringBoot应用程序的入口。接下来,我们将深入分析这个方法及其调用的各个阶段。

3. SpringApplication 类详解

SpringApplication类是SpringBoot应用程序启动过程的核心类。它负责初始化应用程序的上下文,加载配置,启动嵌入式服务器等。

3.1 SpringApplication构造函数

SpringApplication类有多个构造函数,常用的是接收一个或多个Class<?> 参数的构造函数:

public SpringApplication(Class<?>... primarySources) {
    this.setInitializers((Collection) this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
    this.setListeners((Collection) this.getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = this.deduceMainApplicationClass();
}

这里设置了初始化器和监听器,并推断出主应用程序类。

3.2 run 方法

SpringApplication.run方法是启动SpringBoot应用程序的入口:

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    return (new SpringApplication(primarySources)).run(args);
}

这个方法内部调用了SpringApplication实例的run方法:

public ConfigurableApplicationContext run(String... args) {
    // 初始化阶段
    this.configureHeadlessProperty();
    SpringApplicationRunListeners listeners = this.getRunListeners(args);
    listeners.starting();

    // 环境准备阶段
    ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
    this.configureIgnoreBeanInfo(environment);

    // 上下文创建阶段
    Banner printedBanner = this.printBanner(environment);
    ConfigurableApplicationContext context = this.createApplicationContext();
    this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

    // 上下文刷新阶段
    this.refreshContext(context);
    this.afterRefresh(context, applicationArguments);
    listeners.finished(context, null);

    // 应用程序运行阶段
    this.callRunners(context, applicationArguments);
    return context;
}

接下来,我们逐步解析这些方法的具体实现。

4. 启动流程详解

4.1 初始化阶段

在这个阶段,主要是一些基本属性的设置和启动监听器的初始化:

this.configureHeadlessProperty();
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting();

configureHeadlessProperty:设置系统属性java.awt.headless,用于处理缺少显示屏、键盘或鼠标的环境。
getRunListeners:获取并初始化SpringApplicationRunListeners,这些监听器在整个启动过程中会监听并响应不同的事件。

4.2 环境准备阶段

准备应用运行的环境,包括配置属性和配置文件等:

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
this.configureIgnoreBeanInfo(environment);

prepareEnvironment:配置并准备环境,调用监听器的environmentPrepared方法。
configureIgnoreBeanInfo:配置是否忽略BeanInfo信息。

4.3 上下文创建阶段

创建并准备 Spring 应用上下文:

ConfigurableApplicationContext context = this.createApplicationContext();
this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

createApplicationContext:根据配置创建具体的应用上下文,例如 AnnotationConfigApplicationContext。
prepareContext:准备上下文,加载配置,注册Bean,调用监听器的 contextPrepared 方法。

4.4 上下文刷新阶段

刷新应用上下文,完成 Bean 的初始化和依赖注入:

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

refreshContext:刷新应用上下文,触发 Spring 的生命周期事件。
afterRefresh:刷新后的操作,通常用于自定义逻辑。

4.5 应用程序运行阶段

调用所有实现了CommandLineRunner和ApplicationRunner接口的 Bean:

this.callRunners(context, applicationArguments);

callRunners:遍历并调用所有CommandLineRunner和 ApplicationRunner。

5. 结论

通过深入分析SpringBoot应用程序的启动流程,我们可以更好地理解其内部机制,进而在开发中更好地利用这些机制,提高开发效率和代码质量。在后续的文章中,我们将继续探讨SpringBoot的其他关键特性和实现原理。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot源码分析涉及到多个类和方法。其中,方法org.springframework.boot.SpringApplication#prepareContext用于准备应用程序的上下文,并返回一个配置好的Spring应用程序上下文。 Spring Boot的主要目的是简化Spring框架中繁复的配置问题。它通过提供自动配置、约定优于配置和快速开发的原则来实现这一目标。具体来说,它使用了一系列机制来简化开发者的工作,包括自动配置、自动扫描、自动装配等。 在Spring Boot应用程序中,这些机制通常会在应用程序启动时加载到IOC容器中。例如,在一个典型的Spring Boot应用程序的入口类中,使用@SpringBootApplication注解标记了应用程序的主类,并使用@MapperScan注解指定了需要扫描的Mapper接口所在的包。在main方法中,通过调用SpringApplication.run方法来启动应用程序,并将主类和命令行参数传递给它。在运行过程中,Spring Boot会自动扫描应用程序中的注解和配置,并将相应的Bean加载到IOC容器中。 总的来说,Spring Boot源码分析涉及到Spring Boot的核心类和方法,以及它提供的各种机制和配置方式。通过深入研究这些源码,可以更好地理解Spring Boot的工作原理和内部机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [springboot源码分析](https://blog.csdn.net/xiaoxiaoyeyaya/article/details/108560836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot源码分析](https://blog.csdn.net/mutf7/article/details/119387639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值