用户登录
用户注册

分享至

Spring-AbstractRefreshableApplicationContext

  • 作者: 爱的旋律88
  • 来源: 51数据库
  • 2021-10-24

该类属于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();
	}
}
软件
前端设计
程序设计
Java相关