zoukankan      html  css  js  c++  java
  • 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的时候出现的报错信息

  • 相关阅读:
    IT开发者对Mac钟爱
    POJ 3486 & HDU 1913 Computers(dp)
    基础排序算法
    LeetCode 70:Climbing Stairs
    Qt自己定义事件实现及子线程向主线程传送事件消息
    maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐
    Unity定制 Image、Text的对象生成
    iOS学习4_UITableView的使用
    GTK+重拾--09 GTK+中的组件(一)
    Architecting Android…The clean way?
  • 原文地址:https://www.cnblogs.com/xiaomaomao/p/13928647.html
Copyright © 2011-2022 走看看