Spring-Ioc中allowBeanDefinitionOverriding、allowCircularReferences属性

一、属性介绍

  allowBeanDefinitionOverriding:设置是否允许具有相同名称的Bean来覆盖之前的Bean

  在同一个配置文件中定义两个相同的Bean,编译器就会直接报错,但是我们可以在不同的配置文件中定义两个相同的Bean,这种情况下编译器是允许的,例如 ioc01.xml中定义了一个 id=person的Bean,ioc02中也定义了一个相同的id=person的Bean,Spring通过 allowBeanDefinitionOverriding这个属性来控制,是否允许定义两个相同的Bean,默认值是true,(也就是允许定义两个相同的Bean),只不过后加载的配置文件中的Bean会覆盖掉前面加载的配置文件中的Bean.如果allowBeanDefinitionOverriding的值为false,那么就不允许出现两个相同名称的Bean加载到Spring容器中.这样就会报错

  allowCircularReferences:设置是否允许循环引用

    A依赖B,同时B又依赖A

    A依赖B,B依赖C,C依赖A

  这种情况就称为循环引用,Spring默认情况下使允许循环引用的.

二、源码分析

  allowBeanDefinitionOverriding、allowCircularReferences这两个属性值的设置是在AbstractRefreshableApplicationContext这个类中的,具体的源码如下

  我们可以看到这里有两个判断条件 this.allowBeanDefinitionOverriding、this.allowCircularReferences,这两个判断条件的值是什么呢?

  我们在这个类中往上翻,会发现,在该类中这两个属性值都是包装类类型Boolean,而且没有给定初始值,但是包装类类型的默认初始值就是 null啊.

  所以呢,这两个判断条件都不成立,那么自然而然的DefaultListableBeanFactory类型的beanFactory就不能设置值,那么既然不能设置值,它们的初始值又是什么呢?

  翻开DefaultListableBeanFactory这个类,我们可以看到这两个属性的默认值都是true,这样的话,我们就可以知道Spring中这两个属性都是默认为true的了.

三、如何改变这两个属性的默认值

  通过上面的源码分析,我们知道如果你想改变Spring中allowBeanDefinitionOverriding、allowCircularReferences这两个属性的值,那么你实际上改变的是DefaultListableBeanFactory这个类中的这两个属性值,具体的操作也很简单,看一下AbstractRefreshableApplicationContext这个类的源码,你只需要满足this.allowBeanDefinitionOverriding、this.allowCircularReferences这两个属性值不为空,并且他们的值都为false,这样就能改变DefaultListableBeanFactory类中这两个属性的值由原来的true变成false.

  我们可以参照着ApplicationContext的继承体系去实现如何更改这两个值的默认值.

1、方式一

2、方式二

四、当两个配置文件中出现了相同的Bean的时候出现的报错信息

原文地址:https://www.cnblogs.com/xiaomaomao/p/13928647.html