refresh()方法
public void refresh() throws BeansException, IllegalStateException {
//上锁
synchronized (this.startupShutdownMonitor) {
//1、调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识
prepareRefresh();
//2、告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从子类的refreshBeanFactory()方法启动
//(实例化一个DefaultListableBeanFactory,加载资源文件中(xml配置)的配置生成BeanDefinition)
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//3、为BeanFactory配置容器特性,例如类加载器、事件处理器等
prepareBeanFactory(beanFactory);
try {
//4、为容器的某些子类指定特殊的BeanPost事件处理器
postProcessBeanFactory(beanFactory);
//5、调用所有注册的BeanFactoryPostProcessor的Bean (会扫描注册bean到ioc容器)
invokeBeanFactoryPostProcessors(beanFactory);
//6、为BeanFactory注册BeanPostProcessors事件处理器. BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件
registerBeanPostProcessors(beanFactory);
//7、初始化信息源,和国际化相关.
//initMessageSource()方法用来设置国际化资源相关的调用,将实现了MessageSource接口的bean存放
// 在ApplicationContext的成员变量中,先看是否有此配置,如果有就实例化,否
// 则就创建一个DelegatingMessageSource实例的bean
initMessageSource();
//8、初始化容器事件传播器.
//多播器单独的作用不大,他需要与第10步的监听器,构成观察者模式,监听整个过程的触发的事件;
initApplicationEventMulticaster();
//9、调用子类的某些特殊Bean初始化方法
onRefresh();
//10、为事件传播器注册事件监听器.
registerListeners();
//11、初始化所有剩余的单例Bean
finishBeanFactoryInitialization(beanFactory);
//12、初始化容器的生命周期事件处理器,并发布容器的生命周期事件
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
//13、销毁已创建的Bean
destroyBeans();
//14、取消refresh操作,重置容器的同步标识。
cancelRefresh(ex);
// 将exception抛给调用者。
throw ex;
}
finally {
//15、重设公共缓存
resetCommonCaches();
}
}
}