通过断点调试,阅读源码查看SpringBoot的启动原理,启动过程分为创建对象和运行。这里介绍启动时,SpringBoot的创建出对象后执行run方法的运行过程。
1. 启动流程
从main方法出设置断点,然后debug运行
调用SpringApplication的静态方法run,然后,对参数再包装再次调用重载run方法
调用SpringApplication的静态方法run,使用构造函数生成对象
主要流程:使用SpringApplication的静态方法,创建对象,执行run方法:
- 创建
SpringApplication
对象 - 执行
SpringApplication
对象的run方法
2. 创建对象
1 | public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { |
SpringBoot启动后,会先创建SpringApplication
对象,创建过程参考上一篇文章:SpringBoot启动原理(创建)
具体来说,创建过程分为以下几步,每一步又有各自的运行流程:
1. 检查是不是web应用
通过静态方法检查当前类加载器静态属性中是否包含web相应的关键字
2. 设置初始化器
从类路径下META-INF/spring.factories搜索所有ApplicationContextInitializer,并加入list中返回,传给当前的this.initializers
3. 设置监听器
即从类路径”META-INF/spring.factories”获取所有的监听器,并加入list中返回,传给当前类的this.listeners
4. 从所有的配置类中找到主配置累
将找到的主配置类传给当前的this.mainApplicationClass
3. 创建出的对象执行run()方法运行
1 | public ConfigurableApplicationContext run(String... args) { |
3.1 获取SpringApplicationRunListeners
1 | private SpringApplicationRunListeners getRunListeners(String[] args) { |
其中的getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args)也是通过类路径下去找到names,根据names去创建实例,与前面不同的是,前面获取的是ApplicationContextInitializer和ApplicationListener,这里获取的是SpringApplicationRunListener
1 | SpringApplicationRunListeners(Log log, Collection<? extends SpringApplicationRunListener> listeners) { |
3.2 listeners.starting()
查看SpringApplicationRunListener接口有哪些方法:
对于获得的所有SpringApplicationRunListener对象,都执行相应的staring()方法;
1 | public void starting() { |
3.3 准备环境
创建环境完成后回调SpringApplicationRunListeners.environmentPrepared(),表示环境准备完成
1 | private ConfigurableEnvironment prepareEnvironment( |
3.4 创建ApplicationContext(IOC)
1 | protected ConfigurableApplicationContext createApplicationContext() { |
3.5 准备上下文环境
1 | private void prepareContext(ConfigurableApplicationContext context, |
3.6 刷新IOC容器
refreshContext(context):完成IOC的刷新,扫描、刷新、创建IOC组件
afterRefresh(context, applicationArguments):空方法
listeners.started(context):所有的SpringApplicationRunListener回调started()方法
// 从容器中获取并回调ApplicationRunner, 回调CommandLineRunner
callRunners(context, applicationArguments);
1 | private void callRunners(ApplicationContext context, ApplicationArguments args) { |
- 本文作者: zicair
- 本文链接: https://zicair.github.io/2020/07/31/SpringBoot启动原理(运行)/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!