2013-09-26 23 views
3

我注意到如果你在兩個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。

+0

號應該發生什麼,如果2種豆具有相同的名稱/ ID存在?如果你有bean的abc(第一)和abc(第二)的依賴關係,Spring應該如何知道使用哪一個(如果不使用按類型自動裝配的話)。 –

+0

我實際上期待着一個像override = false或final = true這樣的屬性,這樣如果使用具有相同id的bean,Spring將不會通過拋出異常來允許它。 – user2775922

回答

4

您可以通過調用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

鏈接

  1. ApplicationContextInitializer javadoc
  2. AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverriding javadoc
0

另外:

final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(); 
    ctx.setAllowBeanDefinitionOverriding(false); 
    ctx.setConfigLocations(shardContextImport); 
    ctx.setParent(refreshedEvent.getApplicationContext()); 
    ctx.refresh();