@Override publicvoidrefresh()throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing.准备刷新 //容器预先准备 prepareRefresh();
// Tell the subclass to refresh the internal bean factory.刷新bean factory //创建bean工厂,如果有则销毁 //里面实现对beanDefinition的装载 // 告知子类要初始化BeanFactory,BeanDefinition信息的读取是在子类的 // refreshBeanFactory()方法里完成的 //beanDefinition信息是通过ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()里的refreshBeanFactory()来完成的 //而这个方法则是在AbstractRefreshableApplicationContext实现的。 //创建bean工厂,如果有则销毁这个操作就是在refreshBeanFactory() //refreshBeanFactory()中是通过loadBeanDefinitions()来完成BeanDefinition的定位,而loadBeanDefinitions()是一个抽象的方法,具体由AbstractBeanDefinitionReader里的loadBeanDefinitions()来实现。 //在loadBeanDefinitions()通过DefaultResourceLoader的getResource方法里返回resource对象 ConfigurableListableBeanFactorybeanFactory= obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.为这个context准备bean factory //配置bean工厂的标准上下文特性,如类装载器、PostProcesser等 prepareBeanFactory(beanFactory);
try { // Allows post-processing of the bean factory in context subclasses. //beanFactory的后置处理器 //模板方法,在bean定义被装载后,提供一个修改容器beanFactory的入口 postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context. //实现beanFactory的后置处理器 //在Bean未开始实例化时,对Definition定义的修改的入口 //常见的PropertyPlaceholderConfigurer在这里被调用 invokeBeanFactoryPostProcessors(beanFactory);
// Destroy already created singletons to avoid dangling resources. //销毁已注册的bean 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(); } } }
//抽象类,具体的resource定位跟BeanDefinition的载入是委托子类来完成的 /** * Load bean definitions into the given bean factory, typically through * delegating to one or more bean definition readers. * @param beanFactory the bean factory to load bean definitions into * @throws BeansException if parsing of the bean definitions failed * @throws IOException if loading of bean definition files failed * @see org.springframework.beans.factory.support.PropertiesBeanDefinitionReader * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader */ protectedabstractvoidloadBeanDefinitions(DefaultListableBeanFactory beanFactory)throws BeansException, IOException;