在 Spring配置web.xml中标签(ContextLoaderListener类解析)解析一文的最后我们留下了wac.refresh();是怎样执行的问题。
【在ContextLoader类中和FrameworkServlet中都执行了这行代码】
不管是在哪里调用refresh(),执行的都是AbstractApplicationContext的refresh()方法,这里再贴出相应的代码:
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
//会调用XmlWebApplicationContext.loadBeanDefinitions()方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
// 准备bean工厂
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasse
postProcessBeanFactory(beanFactory);
//对beanFactory对象本身调用在此环境中注册的processors
invokeBeanFactoryPostProcessors(beanFactory);
//注册所有的对bean的processors
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
//初始化国际化支持的bean
initMessageSource();
//初始化时间发布器
initApplicationEventMulticaster();
//刷新之后执行的操作
onRefresh();
//注册事件,从bean工厂得到或者这个类设置进来的
registerListeners();
//实例化所有单例的bean
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}
可以看到一系列的初始化,这样Context就完成了刷新(重新加载所有的定义的bean)