spring-boot 运行流程粗略纪要

springboot运行流程,主要集中在springApplication.class这个类中,我们可以通过springboot启动类调用的springApplication.run()方法为起点,粗略的阅读源码,下文为流程粗略纪要,读者可以根据纪要阅读一遍。

一、new SpringApplication,执行initialize()方法
    1)、判断是否是web环境
    2)、加载所有classpath目录下META-INF/spring.factories配置文件中的ApplicationContextInitializer
    3)、加载所有classpath目录下META-INF/spring.factories配置文件中的ApplicationListener
    4)、推断main方法所在的类
二、执行run方法
    1)设置java.awt.headless系统变量
    2)加载所有classpath目录下META-INF/spring.factories配置文件中的SpringApplicationRunListener
    3)执行所有SpringApplicationRunListener的started方法
    4)实例化ApplicationArguments对象
    5)创建environment
    6)配置environment,主要是把run方法配置到environment
    7)执行所有SpringApplicationRunListener的environmentPrepared方法
    8)如果不是webEnvironment,且有必要,则把当前Environment转换为标准的Environment
    9)初始化ApplicationContext,如果是web Environment,则实例化org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
        否则实例化org.springframework.context.annotation.AnnotationConfigApplicationContext
    10)如果beanNameGenerator不为空,就把beanNameGenerator对象注入到context中
    11)回调所有的ApplicationContextInitializer
    12)执行所有SpringApplicationRunListener的contextPrepared方法
    13)依次往spring容器中注入ApplicationArguments、Banner
    14)加载所有的源到context中(源即为springboot项目的启动类)
    15)执行所有SpringApplicationRunListeners的contextLoaded方法
    16)执行applicationContext的refresh方法,并且调用ApplicationContext.registerShutdownHook()方法
    17)回调,获取容器中所有的ApplicationRunner、CommandLineRunner对象,然后排序、依次调用
    18)执行SpringApplicationRunListeners.finished方法,结束所有的监听
    19)结束启动计时,如果启动状态异常,打印日志

建议读者先阅读我的前几篇Spring-boot事件监听和源码分析、spring-boot ApplicationContextInitializer实现与使用、spring-boot CommandLineRunner、ApplicationRunner实现与使用文章,阅读后就能理解他们执行的先后顺序啦~

你可能感兴趣的:(spring-boot 运行流程粗略纪要)