美文网首页
SpringBoot启动过程分析

SpringBoot启动过程分析

作者: huangxiongbiao | 来源:发表于2018-12-12 16:22 被阅读9次

    一、入口类分析

    入口类主要有SpringApplication类的run方法进入,配合SpringBootApplication注解进行配置

    image.png
    SpringBootApplication注解由ComponentScan,EnableAutoConfiguration,EnableAutoConfiguration组合注解构成。
    ComponentScan:可配置扫描包
    EnableAutoConfiguration:注解中Import了AutoConfigurationImportSelector类在此类中会查找META-INF/spring.factories中配置的EnableAutoConfiguration
    image.png
    下面代码为AutoConfigurationImportSelector 中返回注入组件的代码主要由SpringFactoriesLoader加载各个jar包下META-INF/spring.factories配置的EnableAutoConfiguration类返回
    image.png image.png
    spring-boot-autoconfigure-2.1.1.RELEASE.jarMETA-INF/spring.factories的自动配置类信息
    image.png

    二、SpringApplication之run方法

    SpringApplication的静态run方法首先会根据入口类参数实例初始化SpringApplication对象,然后执行对象run方法启动。

    1、实例化方法分析

    此处会初始化是否是web应用,然后初始化ApplicationContextInitializerApplicationListener。初始化过程类似自动配置注解通过SpringFactoriesLoader加载各个jar包下META-INF/spring.factories配置的ApplicationContextInitializerApplicationListener

    image.png image.png
    2、实例run方法分析
    (1)listeners的生命周期通知处理

    红圈处为listeners的生命周期通知处理

    image.png
    具体通知分发代码
    image.png
    (2)spring具体执行
    • spring容器初始化启动的主要方法为prepareContextrefreshContext方法
      prepareContext方法中主要执行listeners事件通知,ApplicationContextInitializer执行,以及加载资源信息BeanDefinitionLoader
      image.png

    refreshContext方法实际执行有AbstractApplicationContext执行refresh,简单的分析refresh执行环节

    spring-refresh.jpg
    • this.postProcessBeanFactory(beanFactory);
      执行当前容器的BeanFactoryPostProcessor的方法
    • this.invokeBeanFactoryPostProcessors(beanFactory);
      执行容器中所有的beanFactoryPostProcessors
    • this.registerBeanPostProcessors(beanFactory);
      注册容器中所有属于BeanPostProcessor组件到容器,在实例初始化前后执行
      this.initMessageSource();
    • this.initApplicationEventMulticaster();
      初始化Listeners分发器
    • this.onRefresh();
      web应用会在ServletWebServerApplicationContext创建web容器
    • this.registerListeners();
      applicationListeners注册进容器
    • this.finishBeanFactoryInitialization(beanFactory);
    • this.finishRefresh();
      清除资源缓存,发送完成事件,注册容器到LiveBeansView

    BeanFactoryPostProcessor 一般由ApplicationContextInitializer的初始化方法或者ApplicationListener增加

    image.png image.png
    web环境下context实际为ServletWebServerApplicationContext执行其中的refresh会转到AbstractApplicationContext执行然后接着会在onRefresh中创建webServer内置web容器
    image.png image.png

    相关文章

      网友评论

          本文标题:SpringBoot启动过程分析

          本文链接:https://www.haomeiwen.com/subject/fhruhqtx.html