AbstractRefreshableApplicationContext继承于AbstractApplicationContext,主要实现BeanFactory刷新(含初始化)。
类作用
1、在基类AbstractApplicationContext多次调用refresh()时,本类负责每次都创建一个新的内部 bean 工厂实例,并加载 bean 定义。
2、注意在web环境下,同ApplicationContext相似的基类是WebApplicationContexts,也有一个同样的子类AbstractRefreshableWebApplicationContext实现同样的功能。
关键类方法
setAllowBeanDefinitionOverriding
设置是否应允许通过注册具有相同名称的bean定义来覆盖原来bean定义。默认为true
setAllowCircularReferences
设置是否允许bean之间可以循环引用,并试着自动解决它们。默认为true。如果设置为false,碰到循环引用就抛出异常。
refreshBeanFactory
该类的关键方法。
作用:关闭之前的 bean 工厂(如果有的话),并为容器生命周期的下一阶段初始化一个新的 bean 工厂
protected final void refreshBeanFactory() throws BeansException {
#关闭之前beanFactory
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
#创建新的BeanFactory。DefaultListableBeanFactory类是框架中spring-Bean模块核心类
DefaultListableBeanFactory beanFactory = createBeanFactory();
#设置BeanFactory序列化器用到id为所属容器id
beanFactory.setSerializationId(getId());
#设置beanFactory是否支持Bean可覆盖及可循环引用
customizeBeanFactory(beanFactory);
#将 bean 定义加载到给定的 bean 工厂中,方法由子类实现。
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
代码中关键方法:
createBeanFactory():创建BeanFactory,核心在Bean模块的DefaultListableBeanFactory类。
loadBeanDefinitions():加载Bean定义,为抽象方法,在子类中实现。通常ApplicationContext是基于何种方式来创建,就在对应的类或基类中实现。如应用容器是ClassPathXmlApplicationContext创建,其实现是在本类子孙类AbstractXmlApplicationContext中实现,详见https://blog.csdn.net/davidwkx/article/details/130702324。
方法执行序列图
为了有助于理解方法全貌,参考如下方法序列图: