org.springframework.context.support.AbstractApplicationContext.refresh
方法中,下面也是围绕其中的逻辑进行讲解。
【1】 prepareRefresh()
java
内部其实很简单,就是设置一些标志,好比开始时间,激活的状态等。spring
【2】prepareBeanFactory(beanFactory)
缓存
作一些简单的准备工做,此处再也不赘述!!!微信
【3】postProcessBeanFactory(beanFactory)
session
主要的做用就是添加了一个后置处理器ServletContextAwareProcessor
app
【4】invokeBeanFactoryPostProcessors(beanFactory)
post
调用容器中的全部的BeanFactoryPostProcessor中的postProcessBeanFactory方法,按照优先级调用,主要实现逻辑在 invokeBeanFactoryPostProcessors()
ui
【5】registerBeanPostProcessors(beanFactory)
this
注册全部的BeanPostProcessor(后置处理器),按照优先级注册,分别是 PriorityOrdered,Ordered,普通的,内部的。主要的实现逻辑在 PostProcessorRegistrationDelegate.registerBeanPostProcessors()spa
【6】initMessageSource()
注册 MessageSource,提供消息国际化等功能
【7】initApplicationEventMulticaster();
注册事件广播器 ApplicationEventMulticaster
,用于 spring 事件的广播和事件监听器的处理
【8】registerListeners()
注册事件监听器 ApplicationListener,而且广播一些早期的事件,主要的逻辑在 org.springframework.context.support.AbstractApplicationContext.registerListeners
【9】finishBeanFactoryInitialization(beanFactory)
实例化全部非懒加载的 Bean,spring 生命周期中的主要方法,主要逻辑在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons,深刻进去其实就是 getBean()方法建立,详情向下看。
【10】finishRefresh()
主要的功能是发布事件 ContextRefreshedEvent
【11】destroyBeans()
容器启动出现异常时销毁 Bean
以上就是 Spring 容器启动的过程,主要的逻辑都在 org.springframework.context.support.AbstractApplicationContext#refresh 中,其余的都很容易理解,如今咱们着重分析一下单例 Bean 的建立过程,入口是第 9 步。
【1】debug 进入,实际主要的逻辑都在 org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons 方法中,逻辑以下:
//获取全部注入到ioc容器中的bean定义信息
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
//循环建立
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//非抽象,单例,非懒加载的bean初始化
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
//若是是FactoryBean
if (isFactoryBean(beanName)) {
//getBean
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
//非FactoryBean,getBean
else {
getBean(beanName);
}
}
}
复制代码
以上源码总结得知,最终实例化 Bean 的方法确定在 getBean 中的,debug 进入,得知 doGetBean 是大 boss,spring 源码有趣的是最终的实现都是在 doxxxx()。
【2】AbstractBeanFactory#doGetBean,因为篇幅过短,就不贴源码了,只贴关键代码
实例化的主要流程所有都在这里,下面一一解析便可。
(1) Object sharedInstance = getSingleton(beanName)
从早期的缓存中获取,若是存在返回 Bean,实例化
(2)BeanFactory parentBeanFactory = getParentBeanFactory()
从父工厂的中获取 Bean
(3)if (mbd.isSingleton())
分单例和多例进行分开建立 Bean,这里只分析单例 Bean 的建立
(4)sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, mbd, args); }
createBean 方法建立 Bean,进入 createBean()
a. Object bean = resolveBeforeInstantiation(beanName, mbdToUse):执行全部的 InstantiationAwareBeanPostProcessor 中的postProcessBeforeInstantiation,在实例化以前调用,返回 null 继续下一步,返回一个 bean,那么 bean 实例化完成,将调用其中的postProcessAfterInstantiation方法
b. Object beanInstance = doCreateBean(beanName, mbdToUse, args):建立 Bean 的完成过程
c. 进入doCreateBean,instanceWrapper = createBeanInstance(beanName, mbd, args):建立 Bean 的实例
d. populateBean(beanName, mbd, instanceWrapper):属性装配,执行 InstantiationAwareBeanPostProcessor 的postProcessAfterInstantiation,再执行postProcessProperties方法。
e. exposedObject = initializeBean(beanName, exposedObject, mbd):初始化 Bean,debug 进入
f. invokeAwareMethods(beanName, bean):调用BeanNameAware,BeanClassLoaderAware,BeanFactoryAware中的对应方法
g. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName):调用 BeanPostProcessord 中的postProcessBeforeInitialization方法
h. invokeInitMethods(beanName, wrappedBean, mbd):执行InitializingBean中的afterPropertiesSet
i. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName):调用BeanPostProcessor中的postProcessAfterInitialization方法
以上是 spring 容器从启动到销毁的所有过程,根据源码陈某画了一张生命周期的图,仅供参考,请勿转载!!!