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()
: 释放资源。 原文:https://www.cnblogs.com/jiuxialb/p/spring-yuan-ma-qi-dong-liu-cheng.html