SpringApplication构造方法
- 加载并初始化META-INF/spring.factories,保存到SpringAppliction对象中。
- 实例化Bootstrapper
- 实例化ApplicationContextInitializer
- 实例化ApplicationListener
版本
spring: 5.3.1
spring-boot: 2.4.0
run方法
1. 计时
2. 根据META-INF/spring.factories初始化DefaultBootstrapContext
3. 实例化SpringApplicationRunListener
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
4. 将ApplicationListener全都装入到SpringApplication.listeners
- 执行SpringApplicationRunListener.starting()
5. 准备环境,配置
1. 加载常规环境
2. 执行SpringApplicationRunListener.environmentPrepared()
3. load factories EnvironmentPostProcessor.class,
- 创建ReflectionEnvironmentPostProcessorsFactory
- 对factories中定义的EnvironmentPostProcessor进行初始化
- 执行postProcessEnvironment
- 添加随机数据源
- 替换封装类OriginAwareSystemEnvironmentPropertySource,启动参数,jvm参数,系统环境变量
- 解析spring.application.json中的配置
- 解析vcap.application属性
- 解析配置文件中的配置属性
- 响应式调试配置中的属性
4. 根据配置初始化日志系统的配置,注册ShutdownHook
5. 对一些耗时的对象进行提前初始化(可选)
6.配置spring.beaninfo.ignore
7.打印banner
8. 创建AnnotationConfigServletWebServerApplicationContext
1. AbstractApplicationContext
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
2. GenericApplicationContext
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
1. 重要,创建beanFactory
2. AbstractAutowireCapableBeanFactory
- 添加一些忽略的依赖,默认使用cglib子类初始化策略
public AbstractAutowireCapableBeanFactory() {
super();
ignoreDependencyInterface(BeanNameAware.class);
ignoreDependencyInterface(BeanFactoryAware.class);
ignoreDependencyInterface(BeanClassLoaderAware.class);
if (IN_NATIVE_IMAGE) {
this.instantiationStrategy = new SimpleInstantiationStrategy();
}
else {
this.instantiationStrategy = new CglibSubclassingInstantiationStrategy();
}
}
3. 最后回到当前类AnnotationConfigServletWebServerApplicationContext
public AnnotationConfigServletWebServerApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
9. 记录applicationcontext启动时的情况
10. 准备context
1. 将springboot准备好的environment覆盖到context中的environment
super.environment = environment;
this