欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring-AbstractRefreshableApplicationContext

程序员文章站 2022-03-25 13:02:10
该类属于ApplicationContext子类,所以是一个BeanFactory,下面介绍本类中最重要的三个字段属性// @Nullable注解表示该字段允许为空// 是否允许覆盖相同名称的对象// 比如有一个类A,注册到容器中的名字叫m// 有有一个类B,注册到容器中的名字也叫m// 如果该字段=true,则B将会覆盖掉A@Nullableprivate Boolean allowBeanDefinitionOverriding;// 如果该字段=true,则允许Bean之间循环依赖@...

该类属于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();
	}
}

本文地址:https://blog.csdn.net/u011624903/article/details/112220314

相关标签: Spring