一、入口类分析
入口类主要有SpringApplication
类的run方法进入,配合SpringBootApplication
注解进行配置
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.jar
中META-INF/spring.factories
的自动配置类信息image.png
二、SpringApplication之run方法
SpringApplication
的静态run
方法首先会根据入口类参数实例初始化SpringApplication
对象,然后执行对象run
方法启动。
1、实例化方法分析
此处会初始化是否是web应用,然后初始化ApplicationContextInitializer
,ApplicationListener
。初始化过程类似自动配置注解通过SpringFactoriesLoader
加载各个jar包下META-INF/spring.factories
配置的ApplicationContextInitializer
和ApplicationListener
2、实例run方法分析
(1)listeners
的生命周期通知处理
红圈处为listeners
的生命周期通知处理
具体通知分发代码
image.png
(2)spring具体执行
-
spring
容器初始化启动的主要方法为prepareContext
、refreshContext
方法
prepareContext
方法中主要执行listeners
事件通知,ApplicationContextInitializer
执行,以及加载资源信息BeanDefinitionLoader
image.png
refreshContext
方法实际执行有AbstractApplicationContext
执行refresh
,简单的分析refresh
执行环节
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
增加
web环境下context实际为
ServletWebServerApplicationContext
执行其中的refresh
会转到AbstractApplicationContext
执行然后接着会在onRefresh中创建webServer内置web容器image.png image.png
网友评论