前面已经对 ClassPathXmlApplicationContext 构造函数及设置资源配置路径做了解析,回顾之前的源码。
public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {
private Resource[] configResources;//资源数组
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
//调用父类构造函数,进行相关对象创建,包括 Environment 对象的创建
super(parent);
//设置资源配置路径
setConfigLocations(configLocations);
if (refresh) {
//执行刷新,整个IOC 容器启动的核心
refresh();
}
}
}
接着来看 Spring 源码的核心执行流程 refresh。
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext {
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
//刷新前准备
prepareRefresh();
//创建容器对象DefaultListableBeanFactory,有两个重要的接口,ListableBeanFactory和ConfigurableBeanFactory。
//加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//对Bean工厂的各种初始化操作
prepareBeanFactory(beanFactory);
try {
//模板方法,扩展实现,子类覆盖方法做额外处理
postProcessBeanFactory(beanFactory);
//实例化并且执行BeanFactoryPostProcessor(BFPP),必须在实例化之前调用,调用各种 beanFactory 处理器
invokeBeanFactoryPostProcessors(beanFactory);
//实例化并且注册所有的BeanPostProcessor,以及监听器
registerBeanPostProcessors(beanFactory);
//为上下文初始化 message 源。
initMessageSource();
//初始化应用消息广播器。
initApplicationEventMulticaster();
//模板方法,用于扩展
onRefresh();
//注册监听器
registerListeners();
//实例化所有非懒加载的单例
finishBeanFactoryInitialization(beanFactory);
//完成整体刷新
finishRefresh();
} catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
} finally {
// 重置缓存
resetCommonCaches();
}
}
}
}