org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory()
首先,hasBeanFactory,判断context目前是否持有bean factory,如果有:先执行一个模版方法,销毁这个context管理的所有bean,默认实现销毁所有context中的单例缓存,调用DisposableBean.destroy()和/或特定的"destroy-method";再closeBeanFactory,即设置beanFactory的id为null,beanFactory为null。
然后,createBeanFactory,为context创建一个internal bean factory。每次refresh()都会被调用,默认实现创建一个以context的getInternalParentBeanFactory()-parent为parent bean factory的org.springframework.beans.factory.support.DefaultListableBeanFactory,子类可以重写此方法来自定义DefaultListableBeanFactory的设置。
然后,将context的id设置为beanFactory的SerializationId。
然后,customizeBeanFactory,自定义beanFactory。自定义context的nternal bean factory,每次refresh()都会被调用,默认实现设置了context的setAllowBeanDefinitionOverriding "allowBeanDefinitionOverriding"以及setAllowCircularReferences "allowCircularReferences",子类可以重写此方法来自定义DefaultListableBeanFactory的设置。
然后,loadBeanDefinitions,加载BeanDefinitions。通过XmlBeanDefinitionReader加载bean definitions。先用BeanFactory创建一个新的XmlBeanDefinitionReader;设置beanDefinitionReader的environment为contextd的resource loading environment;设置beanDefinitionReader的ResourceLoader为context;创建ResourceEntityResolver(this)并设置为beanDefinitionReader的EntityResolver;initBeanDefinitionReader,供子类覆写的方法,初始化beanDefinitionReader,默认为空实现;loadBeanDefinitions,用指定的XmlBeanDefinitionReader加载bean definitions,bean factory的生命周期由refreshBeanFactory方法处理,因此,这个方法只加载和/或注册bean definitions,委托ResourcePatternResolver解析location patterns到Resource实例,先获取configLocations,再调用XmlBeanDefinitionReader的loadBeanDefinitions方法完成beanDefinitions的加载。