Spring源码启动流程
Spring
启动主要是执行了 AbstractApplicationContext
中的 refresh()
方法,此篇主要讲该方法中代码的意义。其中代码如下:
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
// 准备刷新 context
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn(
"Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
this.startupShutdownMonitor
: 只是一个Object
对象,用于确定此方法只会执行一次。-
prepareRefresh()
: 做刷新准备,主要是设置启动时间、状态修改、初始化配置源、查看是否有必须存在的环境变量、清除之前的ApplicationListeners
和applicationevents
。 -
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
: 加载BeanFactory
的相关信息,此时bean
的定义信息已经加载成功。 -
prepareBeanFactory(beanFactory)
: 向BeanFactory
添加一些定义信息. -
postProcessBeanFactory(beanFactory)
: 所有的bean
定义信息已经加载,但是还没有实例化时执行,可以通过实现该方法进行扩展spring
的功能,实现对类的特殊操作。 -
invokeBeanFactoryPostProcessors(beanFactory)
: 调用在上下文中注册为Bean
的工厂处理器。 -
registerBeanPostProcessors(beanFactory)
: 注册拦截Bean
创建的Bean
处理器。 -
initMessageSource()
: 初始化消息数据源。 -
initMessageSource()
: 初始化事件多播器。 -
onRefresh()
: 开始刷新。 -
registerListeners()
: 注册监听器。 -
finishBeanFactoryInitialization(beanFactory)
: 结束BeanFactory
的初始化。 -
finishRefresh()
: 结束刷新。 -
resetCommonCaches()
: 释放资源。