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