`

Spring Boot启动流程简单解释

 
阅读更多

Spring Boot程序有一个入口,就是main方法。main里面调用SpringApplication.run()启动整个Spring Boot程序,该方法所在类需要使用@SpringBootApplication注解。

 

@SpringBootApplication包括三个注解:

 

 

 

@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置。简单概括一下就是,是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。

 

@Configuration:它就是JavaConfig形式的Spring Ioc容器的配置类。被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境。

 

@ComponentScan:组件扫描,可自动发现和装配Bean,功能其实就是自动扫描并加载符合条件的组件或者bean定义,最终将这些bean定义加载到IoC容器中。可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下。

 

 

 

运行run方法之前需要对SpringApplication进行初始化,会调用一个private类型的的initialize方法

public SpringApplication(Object... sources) {
    initialize(sources);
}

 initialize方法的具体实现:

private void initialize(Object[] sources) {
      if (sources != null && sources.length > 0) {
        this.sources.addAll(Arrays.asList(sources)); // 把sources设置到SpringApplication的sources属性中,目前只是一个MyApplication类对象
      }
      this.webEnvironment = deduceWebEnvironment(); // 判断是否是web程序(javax.servlet.Servlet和org.springframework.web.context.ConfigurableWebApplicationContext都必须在类加载器中存在),并设置到webEnvironment属性中
      // 从spring.factories文件中找出key为ApplicationContextInitializer的类并实例化后设置到SpringApplication的initializers属性中。这个过程也就是找出所有的应用程序初始化器
      setInitializers((Collection) getSpringFactoriesInstances(
          ApplicationContextInitializer.class));
      // 从spring.factories文件中找出key为ApplicationListener的类并实例化后设置到SpringApplication的listeners属性中。这个过程就是找出所有的应用程序事件监听器
      setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
      // 找出main类,这里是MyApplication类
      this.mainApplicationClass = deduceMainApplicationClass();
    }

 

SpringBoot启动的时候,不论调用什么方法,都会构造一个SpringApplication的实例,然后调用这个实例的run方法,这样就表示启动SpringBoot。 

 

在run方法调用之前,也就是构造SpringApplication的时候会进行初始化的工作,初始化的时候会做以下几件事:

 

1.把参数sources设置到SpringApplication属性中,这个sources可以是任何类型的参数。

 

2.判断是否是web程序,并设置到webEnvironment这个boolean属性中。 

 

3.找出所有的初始化器,默认有5个,设置到initializers属性中 。

 

4.找出所有的应用程序监听器,默认有9个,设置到listeners属性中 。

 

5.找出运行的主类(main class) 。

 

 

 

SpringApplication构造完成之后调用run方法,启动SpringApplication,run方法执行的时候会做以下几件事:

 

1.构造一个StopWatch,观察SpringApplication的执行 。

 

2.找出所有的SpringApplicationRunListener并封装到SpringApplicationRunListeners中,用于监听run方法的执行。监听的过程中会封装成事件并广播出去让初始化过程中产生的应用程序监听器进行监听 。

 

3.构造Spring容器(ApplicationContext),并返回 。

 

    3.1 创建Spring容器的判断是否是web环境,是的话构造AnnotationConfigEmbeddedWebApplicationContext,否则构        造 AnnotationConfigApplicationContext 。

 

    3.2 初始化过程中产生的初始化器在这个时候开始工作 。

 

    3.3 Spring容器的刷新(完成bean的解析、各种processor接口的执行、条件注解的解析等等) 。

 

4.从Spring容器中找出ApplicationRunner和CommandLineRunner接口的实现类并排序后依次执行。

 

 

 

引用另一版本的解释:

 

 

 

SpringApplication的run方法的实现是我们本次旅程的主要线路,该方法的主要流程大体可以归纳如下:

 

1) 如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:

根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。

使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。

使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。

 

推断并设置main方法的定义类。

 

2) SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,告诉这些SpringApplicationRunListener,“嘿,SpringBoot应用要开始执行咯!”。

 

3) 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。

 

4) 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们:“当前SpringBoot应用使用的Environment准备好了咯!”。

 

5) 如果SpringApplication的showBanner属性被设置为true,则打印banner。

 

6) 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。

 

7) ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

 

8) 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

 

9) 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

 

10) 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

 

11) 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。

 

12) 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

 

13) 正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)

 

去除事件通知点后,整个流程如下:

 

 

 

分享到:
评论

相关推荐

    Spring Boot启动流程.png

    Spring Boot启动流程.png

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    这本书旨在简化生产级应用程序的开发过程,特别是利用Spring Boot 3.0框架。Spring Boot是Spring生态系统中的一个核心组件,它通过自动化配置、起步依赖和内嵌式Web服务器等功能,极大地简化了Java应用的开发。 在...

    spring boot 简单案例下载

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,使得开发者能够快速地创建出生产...

    Spring Boot启动流程.doc

    在本文中,我们将深入探讨Spring Boot启动时涉及的主要步骤,包括注解解析和启动方法的执行。 首先,我们关注`@SpringBootApplication`注解,这是Spring Boot应用程序的核心。这个注解实际上是三个关键注解的组合:...

    Spring Boot整合Spring Batch,实现批处理

    Spring Boot以其简洁的配置和快速的启动能力深受开发者喜爱,而Spring Batch作为Spring框架的一部分,专注于批量处理任务,提供了强大的数据处理能力和事务管理功能。下面我们将深入探讨这个主题。 首先,**Spring ...

    十分钟上手spring boot

    ### 十分钟上手Spring Boot ...通过以上内容的学习,开发者可以快速掌握Spring Boot的基础知识,并能够开始开发简单的Spring Boot应用。随着经验的积累,开发者可以进一步探索Spring Boot的更多高级功能和技术细节。

    Spring Boot讲义.pdf

    Spring Boot是一个基于Spring框架的开源Java平台,它简化了基于Spring的应用开发过程。在Spring Boot中,"快速入门"通常指的是新手或初学者对Spring Boot的基本认识和基础使用,能够快速构建和部署一个Spring Boot...

    Spring Boot 教程、技术栈示例代码,快速简单上手教程。

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如 JDBC、MongoDB、RabbitMQ、Quartz 等,使得开发者可以“零配置”地启动项目,...

    spring boot 简单实现

    Spring Boot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建以及开发过程。它提供了一种“开箱即用”的体验,允许开发者快速构建可独立运行的Java应用。在这个"spring boot简单实现"的项目中,我们可以看到...

    史上最简单的spring boot程序

    Spring Boot 是一个由 Pivotal Team 创建的 Java 框架,它旨在简化Spring应用程序的初始搭建以及开发过程。这个框架构建于 Spring Framework 之上,提供了自动配置、嵌入式服务器、运行时指标以及对各种常用库的支持...

    82. Spring Boot – 启动彩蛋【从零开始学Spring Boot】

    关于标签"源码",我们可以进一步讨论Spring Boot启动过程的源码分析。Spring Boot的启动流程涉及多个组件,包括`SpringApplication`、`ApplicationContext`等。在启动过程中,`SpringApplication.run()`方法是主要...

    Spring Boot 进阶笔记.pdf

    Spring Boot 的设计目的简单一句话:简化 Spring 应用的初始搭建和开发过程。 在搭建 Spring Boot 项目时,有很多种方式,但最常见的两种方式是创建 Maven 项目和使用 IDEA 中的 Spring Initializr 创建项目。在...

    Spring Boot 进阶笔记(详细全面) 中文PDF完整版.pdf

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化基于 Spring Framework 的应用程序的初始设置和开发过程。它的核心理念是“约定优于配置”,这意味着 Spring Boot 在默认情况下已经预设了很多常用的配置,...

    《Vue Spring Boot前后端分离开发实战》源码Vue+Spring Boot前后端分离开发实战教学课件(PPT)

    2. **Spring Boot**:Spring Boot是基于Spring框架的快速开发工具,它简化了Spring应用的初始搭建以及开发过程。通过自动配置和起步依赖,Spring Boot可以让开发者迅速启动一个功能完备的应用。 3. **前后端分离**...

    Spring Boot揭秘 PDF

    书中对Spring Boot的启动原理进行了详细分析,包括如何加载配置、如何初始化Bean、自动配置的工作原理等,这些都是理解Spring Boot工作方式的关键。通过阅读本书,读者可以深入理解Spring Boot的设计理念,提高在...

    Spring Boot Tutorial 《Spring Boot 教程》

    4. **Spring Application**:`SpringApplication.run()`是启动Spring Boot应用的关键,它负责初始化SpringApplicationContext并加载配置。 5. **YAML/Properties配置**:Spring Boot支持使用 YAML 或 Properties ...

    Eclipse Spring Boot maven web demo 简单项目实例

    【Eclipse Spring Boot Maven Web Demo 简单项目实例】是一个实用的学习资源,旨在帮助开发者快速搭建基于Spring Boot、Maven和Eclipse的Web应用程序。这个项目实例为初学者提供了良好的起点,让他们能够理解并实践...

    Spring+Boot实战

    书中会详细介绍如何创建一个基础的Spring Boot应用,包括使用Spring Initializr初始化项目、添加依赖、配置启动类等步骤。 其次,Spring Boot集成了许多流行的技术,如Spring MVC、Thymeleaf、MyBatis等,使得开发...

    Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动

    Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动 本文主要介绍了Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动的相关知识点,用于帮助开发者更好地理解Spring Boot的启动过程。 一、...

    Spring Boot in Action 英文版

    Spring Boot是一套开源的Java框架,由Pivotal团队提供支持,其设计目的是简化新Spring应用的初始搭建以及开发过程。它使用了特定的方式来配置Spring,从而使得开发者能够创建独立的、生产级别的Spring应用。Spring ...

Global site tag (gtag.js) - Google Analytics