Spring-AbstractRefreshableApplicationContext

该类属于ApplicationContext子类,所以是一个BeanFactory,下面介绍本类中最重要的三个字段属性

// @Nullable注解表示该字段允许为空
//
// 该字段表示是否允许覆盖相同名称的对象
// 比如有一个类A,注册到容器中的名字叫m
// 又有一个类B,注册到容器中的名字也叫m
// 如果该字段=true,则B将会覆盖掉A
@Nullable
private Boolean allowBeanDefinitionOverriding;
// 如果该字段=true,则允许Bean之间循环依赖
@Nullable
private Boolean allowCircularReferences;

/** Bean factory for this context. */
@Nullable
private volatile DefaultListableBeanFactory beanFactory;

了解上述字段属性,我们看下面的customizeBeanFactory方法

protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
    
    
	// 此处判断是否为null,说明有其他地方很可能对其赋值
	if (this.allowBeanDefinitionOverriding != null) {
    
    
		beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
	}
	// 此处判断是否为null,说明有其他地方很可能对其赋值
	if (this.allowCircularReferences != null) {
    
    
		beanFactory.setAllowCircularReferences(this.allowCircularReferences);
	}
}

继续说上述为什么判断=null,主要目的是为了我们自己实现ApplicationContext的时候重写setAllowBeanDefinitionOverriding和setAllowCircularReferences时候用的,也就是说如果当前ApplicationContext是我们自己实现的ApplicationContext的话,spring要判断一下我们的ApplicationContext是否对这两个字段进行了设置,其实从方法名customize就可以看出来的,这么设计和AbstractApplicationContext.prepareRefresh方法是一样的原则,下面是示例代码,该代码体现了customizeBeanFactory方法的用途

public class MysTest extends ClassPathXmlApplicationContext {
    
    
	//正是因为我重写了该方法,所以spring需要判断一下是否不为空
	@Override
	public void setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding) {
    
    
		super.setAllowBeanDefinitionOverriding(false);
	}
	//正是因为我重写了该方法,所以spring需要判断一下是否不为空
	@Override
	public void setAllowCircularReferences(boolean allowCircularReferences) {
    
    
		super.setAllowCircularReferences(false);
	}

	public static void main(String[] args) {
    
    
		ClassPathXmlApplicationContext ctx = new MysTest();
		ctx.refresh();
	}
}

猜你喜欢

转载自blog.csdn.net/u011624903/article/details/112220314
今日推荐