上一篇中,已经创建环境对象(StandardEnvironment)并解析了给定的xml文件路径,在prepareRefresh方法中也将容器的标志位进行了设置。本篇会着重讲解BeanFactory的创建,以及在BeanFactory创建时的初始化动作。
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
// 调用父类构造方法,进行相关的对象创建等操作,包含属性的赋值操作
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
refresh
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
/**
1. 设置容器开始时间
2. 设置激活标志位
3. 设置关闭标志位
4. 获取Environment对象,将当前系统属性对象放到Environment中
5. 准备监听集合对象,默认为null。
*/
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
//创建容器对象DefaultListableBeanFactory
//完成BeanDefinition的初始化。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//省略部分代码
}
}
obtainFreshBeanFactory()
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 刷新beanFactory
refreshBeanFactory();
// 获取beanFactory对象
return getBeanFactory();
}
refreshBeanFactory
如果存在beanFactory就销毁,并获取新的DefaultListableBeanFactory
protected final void refreshBeanFactory() throws BeansException {
// 如果存在beanFactory,则销毁关闭beanFactory
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
//创建DefaultListableBeanFactory,会在父类AbstractAutowireCapableBeanFactory构造方法中,忽略Aware接口
DefaultListableBeanFactory beanFactory = createBeanFactory();
// 为了序列化指定id,可以从id反序列化到beanFactory对象
beanFactory.setSerializationId(getId());
//定制beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
customizeBeanFactory(beanFactory);
//加载xml文件
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
catch (IOException ex) {
}
}
createBeanFactory()
创建一个DefaultListableBeanFactory,并在父类 构造器中进行要依赖接口的忽略。
//DefaultListableBeanFactory的父类
public AbstractAutowireCapableBeanFactory(@Nullable BeanFactory parentBeanFactory) {
this();
//设置父类工厂
setParentBeanFactory(parentBeanFactory);
}
public AbstractAutowireCapableBeanFactory() {
super();
// 忽略要依赖的接口
ignoreDependencyInterface(BeanNameAware.class);
ignoreDependencyInterface(BeanFactoryAware.class);
ignoreDependencyInterface(BeanClassLoaderAware.class);
}
public void setParentBeanFactory(@Nullable BeanFactory parentBeanFactory) {
// 如果当前已经有一个父级bean工厂,且传进来的父级bean工厂与当前父级bean工厂不是同一个
if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
// 抛出异常
}
if (this == parentBeanFactory) {
throw new IllegalStateException("Cannot set parent bean factory to self");
}
this.parentBeanFactory = parentBeanFactory;
}
customizeBeanFactory
可重写customizeBeanFactory方法来改写allowBeanDefinitionOverriding和allowCircularReferences的值
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
// 如果属性allowBeanDefinitionOverriding不为空,设置给beanFactory对象相应属性,是否允许覆盖同名称的不同定义的对象
if (this.allowBeanDefinitionOverriding != null) {
beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
// 如果属性allowCircularReferences不为空,设置给beanFactory对象相应属性,是否允许bean之间存在循环依赖
if (this.allowCircularReferences != null) {
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
}
}