一、屬性介紹
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的時候出現的報錯信息