我注意到如果你在兩個xml文件中定義了一個具有相同id的bean,它將會在第二個文件中被覆蓋。如何在Spring中停止Overiding bean
Say in file a.xml i have
<bean id="abc" />
Say in file b.xml i have
<bean id="abc" />
然後接收b.xml的bean「abc」。有沒有辦法在春季停止過度,即應該是唯一的,無論有多少xml擁有bean abc。
我注意到如果你在兩個xml文件中定義了一個具有相同id的bean,它將會在第二個文件中被覆蓋。如何在Spring中停止Overiding bean
Say in file a.xml i have
<bean id="abc" />
Say in file b.xml i have
<bean id="abc" />
然後接收b.xml的bean「abc」。有沒有辦法在春季停止過度,即應該是唯一的,無論有多少xml擁有bean abc。
您可以通過調用setAllowBeanDefinitionOverriding
並通過false
禁用該功能來禁止beanoverriding。這必須在任何加載之前儘早完成。你可能需要爲此創建自己的自定義ContextLoader
,或者(如果你使用Spring 3.1或更高版本),你可以創建一個ApplicationContextInitializer
並在web.xml中註冊它。
public class OverrideDisablingApplicationContextInitializer implements ApplicationContextInitializer {
public void void initialize(<? extends ConfigurableApplicationContext> applicationContext);
if (applicationContext instanceof AbstractRefreshableApplicationContext) {
(AbstractRefreshableApplicationContext (applicationContext)).setAllowBeanDefinitionOverriding(false);
}
}
在web.xml中添加以下內容(爲ContextLoaderListener
使用一個init-參數有關的DispatcherServlet
需要時)
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>your.package.here.OverrideDisablingApplicationContextInitializer<param-value>
</context-param>
從我頭上這頂應禁用壓倒一切的行爲。如果您使用彈簧WebApplicationInitializer,則更容易,因爲您可能自己構建ApplicationContext
,然後您可以直接調用該方法,並且不需要ApplicationContextInitializer
。
鏈接
另外:
final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.setAllowBeanDefinitionOverriding(false);
ctx.setConfigLocations(shardContextImport);
ctx.setParent(refreshedEvent.getApplicationContext());
ctx.refresh();
號應該發生什麼,如果2種豆具有相同的名稱/ ID存在?如果你有bean的abc(第一)和abc(第二)的依賴關係,Spring應該如何知道使用哪一個(如果不使用按類型自動裝配的話)。 –
我實際上期待着一個像override = false或final = true這樣的屬性,這樣如果使用具有相同id的bean,Spring將不會通過拋出異常來允許它。 – user2775922