文章目录

  • 叙述
  • @SpringBootApplication
  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @AutoConfigurationPackage
  • @Import(AutoConfigurationImportSelector.class)
  • springboot启动简单流程


叙述

spring boot java启动顺序 spring boot的启动过程_加载


上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,

  • 第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器
  • 第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块
  • 第三部分是自动化配置模块,该模块作为springboot自动配置核心

@SpringBootApplication

说springboot的启动流程当然少不了springboot启动入口类

@SpringBootApplication
public class SpringBootWebApplication {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(SpringBootWebApplication.class);
        application.run(args);
    }
}

每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类需要使用@SpringBootApplication注解.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

以上代码很容易看出哪些是关键,当然是@SpringBootApplication和application.run()分别是springboot加载配置和启动,下面详细说明这两块。

@SpringBootConfiguration

它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。配置类也是容器中的一个组件;@Component。如下案例说明xml和注解实现bean的定义

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-lazy-init="true">
       <!--bean定义-->
</beans>

@EnableAutoConfiguration

告诉SpringBoot开启自动配置功能;这样自动配置才能生效

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage

自动配置包,其真正的注解是@Import(AutoConfigurationPackages.Registrar.class):Spring的底层注解@Import,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class 将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;

@Import(AutoConfigurationImportSelector.class)

@EnableAutoConfiguration简单的说它的作用就是借助@Import的支持,收集和注册特定场景相关的bean定义。其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持很智能的自动配置:

springboot启动简单流程

  1. 当我们运行SpringApplication的main方法时,调用静态方法run()首先是实例化,SpringApplication初始化的时候主要做主要做三件事:
  • 根据classpath下是否存在(ConfigurableWebApplicationContext)判断是否要启动一个web applicationContext。
  • SpringFactoriesInstances加载classpath下所有可用的ApplicationContextInitializer
  • SpringFactoriesInstances加载classpath下所有可用的ApplicationListener
  1. SpringApplicatio实例化完成并且完成配置后调用run()方法,首先遍历初始化过程中加载的SpringApplicationRunListeners,然后调用starting(),开始监听springApplication的启动。
  2. 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment。将配置环境(Environment)加入到监听器对象中(SpringApplicationRunListeners)。
  3. banner属性的设置
  4. ConfigurableApplicationContext(应用配置上下文)创建,根据webEnvironment是否是web环境创建默认的contextClass
    ,AnnotationConfigEmbeddedWebApplicationContext(通过扫描所有注解类来加载bean)和ConfigurableWebApplicationContext),最后通过BeanUtils实例化上下文对象,并返回。
  5. prepareContext()方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联
  6. refreshContext(context),bean的实例化完成IoC容器可用的最后一道工序
  7. 最后springboot做一些收尾工作。自此springboot的简单流程到此结束

感谢您的阅读~~