1. 执行SpringApplication的静态run方法会实例化了一个SpringApplication对象,调用的是该类的有参构造方法。
2. SpringApplication实例初始化完成并且完成设置后,开始执行run方法,首先遍历执行所有通过SpringFactoriesLoader查找到并加载的SpringApplicationRunListener,调用它们的starting()方法。
3. 准备并配置当前Spring Boot应用程序要使用的Environment(包括PropertySource和Profiles)。
4. 遍历执行所有SpringApplicationRunListener的environmentPrepared()的方法。比如创建ApplicationContext。
5. 判断SpringApplication的bannerMode,是CONSOLE则输出banner到System.out,是OFF则不打印,是LOG则输出到日志文件中。
6. 判断是否设置applicationContextClass属性,如果有,则实例化该class;如果没有,则判断是否是Web环境,如果是DEFAULT_WEB_CONTEXT_CLASS,则实例化该常量所对应的AnnotationConfigEmbeddedWebApplicationContext类,否则实例化DEFAULT_CONTEXT_CLASS所对应的AnnotationConfigApplicationContext类。
7. 将之前准备好的environment配置给当前的ApplicationContext。
8. 将beanNameGenerator、resourceLoader配置给当前的ApplicationContext。
9. 创建好ApplicationContext之后,SpringApplication会通过SpringFactoriesLoader查找classpath中所有可用的ApplicationContextInitializer,遍历并加载这些ApplicationContextInitializer的initialize(context)方法来对当前的ApplicationContext做进一步的处理。
10. 遍历执行所有SpringApplicationRunListener的contextPrepared()方法。
11. 为BeanDefinitionLoader配置beanNameGenerator、resourceLoader、environment,并加载之前通过@EnableAutoConfiguration获取的所有配置,以及其余IoC容器配置到当前已准备完毕的ApplicationContext。
12. 遍历执行所有SpringApplicationRunListener的contextLoaded()方法。
13. 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后工序,并为Runtime.getRuntime()添加ShutdownHook以便在JVM停止时优雅退出。
14. 查找当前ApplicationContext中是否注册ApplicationRunner或CommandLineRunner,如果是,则遍历执行它们。
15. 正常情况下,遍历执行SpringApplicationRunListener的finished()方法。
网友评论