如何在Spring中停止覆盖bean

时间:2013-09-26 17:02:37

标签: spring

我注意到如果你在两个xml文件中定义一个具有相同id的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”。有没有办法在Spring中停止覆盖,即无论有多少xml有bean abc都应该是唯一的。

2 个答案:

答案 0 :(得分: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,在需要时使用DispatcherServlet的init-param)

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>your.package.here.OverrideDisablingApplicationContextInitializer<param-value>
</context-param>

从我的头脑中,这应该禁用覆盖行为。如果您使用spring WebApplicationInitializer,那么您可能更容易构建ApplicationContext,您可以直接调用该方法,而不需要ApplicationContextInitializer

链接

  1. ApplicationContextInitializer javadoc
  2. AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverriding javadoc

答案 1 :(得分:1)

此外:

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