初探SpringBoot启动原理
初探SpringBoot启动原理
SpringApplication
1 | public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { |
1、创建SpringApplication
1 | public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { |
this.bootstrapRegistryInitializers = new ArrayList<>(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
- 会在Spring.factories文件中查找org.springframework.boot.BootstrapRegistryInitializer
- 并将查找到的组件存放在SpringApplication对象的 bootstrapRegistryInitializers中
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
会在Spring.factories文件中查找org.springframework.context.ApplicationContextInitializer
将查找的组件保存在SpringApplication对象的 initializers中
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
会在Spring.factories文件中查找监听器org.springframework.context.ApplicationListener
并将查找到的组件保存在SpringApplication对象的listeners中
2、运行SpringApplication
1 | public ConfigurableApplicationContext run(String... args) { |
DefaultBootstrapContext bootstrapContext = createBootstrapContext() 创建引导上下文
- 获取之前所有存放在SpringApplication对象中的bootstrapRegistryInitializers中的值,遍历调用initialize进行初始化,来完成对启动上下文的设置
configureHeadlessProperty(); 设置java.awt.headless 属性,让当前应用进入headless模式
getRunListeners(args),获取所有运行时监听器
去Spring.factories文件中查找SpringApplicationRunListener
listeners.starting(bootstrapContext, this.mainApplicationClass);
- 遍历所有SpringApplicationRunListeners,调用listener.starting(bootstrapContext)方法完成listener初始化,这个方法允许你在应用程序启动的早期阶段进行一些自定义设置或操作
prepareEnvironment(listeners, bootstrapContext, applicationArguments); 准备所有的环境信息
ConfigurableEnvironment environment = getOrCreateEnvironment();,根据webApplicationType中的值返回一个对应的环境
因为时servlet环境所以返回一个servlet环境
配置返回的servlet环境环境
- configurePropertySources(environment, args); 加载应用程序的配置属性,包括外部属性文件和默认属性
- 为应用程序设置活动的配置文件(Profile)。
绑定属性值
environmentPrepared(),用于执行一些需要在应用程序启动前对配置属性进行干预的情况
createApplicationContext();创建ioc容器
- 根据当前web应用的类型创建ioc容器/beang工厂
- 根据当前web应用的类型创建ioc容器/beang工厂
prepareContext(),准备ioc容器基本信息
保存环境信息
postProcessApplicationContext(context) ioc的后置处理,添加类型转换器 。。。
applyInitializers(),应用程序初始化器
- 遍历所有SpringApplication对象的ApplicationContextInitializer来完成对ioc容器初始化的扩展
listeners.contextPrepared(context)遍历所有的SpringApplicationRunListeners,调用contextLoaded()
springApplicationArguments、springBootBanner、日志相关组件存放到单例池中
listeners.contextLoaded(context);遍历所有SpringApplicationRunListeners,调用contextLoaded()方法的扩展 Spring Boot 应用程序的启动过程
refreshContext(context); 刷新Ioc容器,创建和初始化bean
Spring生命周期分析
refreshContext(context); 刷新Ioc容器,创建和初始化bean
1 | protected void refresh(ConfigurableApplicationContext applicationContext) { |
AbstractApplicationContext
1 | public void refresh() throws BeansException, IllegalStateException { |
prepareRefresh(); 刷新ioc容器的准备阶段
- 清除包扫描缓存资源
- 初始化属性源
prepareBeanFactory(beanFactory);,准备bean工厂
```java
….
beanFactory.setBeanClassLoader(getClassLoader());
if (!shouldIgnoreSpel) {
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
}
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));// Configure the bean factory with context callbacks.
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);// BeanFactory interface not registered as resolvable type in a plain factory.
// MessageSource registered (and found for autowiring) as a bean.
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);// Register early post-processor for detecting inner beans as ApplicationListeners.
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
….1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
- 配置bean工厂
- 设置ClassLoader、后处理器
- 添加 ApplicationContextAwareProcessor 作为 Bean 后置处理器,这样在初始化 Bean 时可以将当前应用程序上下文传递给实现 ApplicationContextAware 接口的 Bean。这样,这些 Bean 可以访问应用程序上下文以获取其他 Bean 和资源。
- 忽略一些依赖接口、注册可解析的依赖类型
- 注册应用程序监听器检测器
- 将一些默认环境注册为一个bean
- postProcessBeanFactory(beanFactory);bean工厂后处理
- 添加一些后处理器、注册web应用程序作用域
- invokeBeanFactoryPostProcessors(beanFactory);
- 调用BeanFactoryPostProcessors,来对bean进行额外的配置
- 添加属性配置、修改Bean定义,封装beanDefinitionNames、调用并注册在应用程序上下文中的 BeanFactory 后处理器
- 
- registerBeanPostProcessors(beanFactory); 注册 Bean 后处理器
- 
- initMessageSource();初始化源,一般用来处理国际化
- 
- initApplicationEventMulticaster(); 初始化事件监听器监听器
- 
- onRefresh();注册一些特殊类型的bean (tomcat,servlet)
- finishBeanFactoryInitialization(beanFactory);创建和初始化bean
#### **finishBeanFactoryInitialization()**
```java
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
}
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver((strVal) -> {
return this.getEnvironment().resolvePlaceholders(strVal);
});
}
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
String[] var3 = weaverAwareNames;
int var4 = weaverAwareNames.length;
for(int var5 = 0; var5 < var4; ++var5) {
String weaverAwareName = var3[var5];
this.getBean(weaverAwareName);
}
beanFactory.setTempClassLoader((ClassLoader)null);
beanFactory.freezeConfiguration();
beanFactory.preInstantiateSingletons(); //实例化单例bean
}
进入 preInstantiateSingletons();
1 | public void preInstantiateSingletons() throws BeansException { |
isFactoryBean(beanName)
- 根据beanname 从singletonObjects(单例池)获取这个bean如果能获取到这个bean则代表这个bean已经在前面实例化了
- 如果在单例池中没有存在这个bean,则检查bean的定义,根据bean定义判断是否是FactoryBean实例
- 如果单例池中存在了这个bean,判断这个bean是否是FactoryBean的实例
- 如果这个bean是FactoryBean的实例则返回true,否则返回false
getBean(beanName);获取bean,根据beanname在单例池中去查找判断是否存在这个bean
如果在单例池中能获取到bean,则直接返回这个bean
如果不存在这个bean,
将这个beanname添加到alreadyCreated中,将这个bean标记为已创建
准备开始bean的实例化
获取并检查bean的定义、判断是否是抽象,如果是抽象的则抛出异常
mbd.getDependsOn(),获取这个bean的依赖关系,如果不为空初始化当前bean所依赖的bean
String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { if (isDependent(beanName, dep)) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); } registerDependentBean(dep, beanName); try { getBean(dep); } catch (NoSuchBeanDefinitionException ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", ex); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
- 调用createBean方法创建bean
- 在实例化前会调用resolveBeforeInstantiation方法进行解析,会调用前置处理器和后置处理器进行处理
- 调用实现了**InstantiationAwareBeanPostProcessor**接口类的前置处理器**postProcessBeforeInstantiation**方法进行实例化前处理
- ```java
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
//实例化前bean处理器
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
return null;
}最后调用doCreateBean方法来完成bean的创建
如果是单例bean,会将创建完成的bean放到单例池中
doCreateBean()
AbstractAutowireCapableBeanFactory.class
1 | protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args) |
- createBeanInstance 创建bean实例
- 确定构造方法-遍历构造方法,查找构造方法上是否有,
Autowired
注解 - instantiateBean,用默认构造实例化该bean
- 解析构造方法,利用反射通过构造方法去创建对象
- 确定构造方法-遍历构造方法,查找构造方法上是否有,
- populateBean()填充bean属性
- initializeBean() 初始化bean
populateBean()
调用实现了InstantiationAwareBeanPostProcessor接口类的后置处理器postProcessAfterInstantiation方法进行实例后处理
- ```java
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 调用实现了**InstantiationAwareBeanPostProcessor**接口类的**postProcessProperties**方法进行属性处理
- ```java
//依次调用处理器来完成属性的赋值
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
return;
}
}
pvs = pvsToUse;
}
- ```java
initializeBean()
1 | protected Object initializeBean(String beanName, Object bean, { RootBeanDefinition mbd) |
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);,调用初始化bean前的处理器
invokeInitMethods(beanName, wrappedBean, mbd); ,执行初始化方法
//判断这个bean是否实现了InitializingBean方法,如果实现则返回true boolean isInitializingBean = (bean instanceof InitializingBean); if (isInitializingBean && (mbd == null || !mbd.hasAnyExternallyManagedInitMethod("afterPropertiesSet"))) { if (logger.isTraceEnabled()) { logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'"); } if (System.getSecurityManager() != null) { try { AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> { ((InitializingBean) bean).afterPropertiesSet(); return null; }, getAccessControlContext()); } catch (PrivilegedActionException pae) { throw pae.getException(); } } else { //调用bean的afterPropertiesSet()方法 ((InitializingBean) bean).afterPropertiesSet(); } } //bean @Override public void afterPropertiesSet() throws Exception { System.out.println("service...init"); }
applyBeanPostProcessorsAfterInitialization()实例化后处理器
遍历,依次调用后置处理器,进行后置处理
总结
四个主要阶段
- 实例化(Instantiation)
- 属性赋值(Populate)
- 初始化(Initialization)
- 销毁(Destruction)
图一
图二