4

我注意到,如果您在两个 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 中有没有办法停止覆盖 ie 应该是唯一的,无论有多少 xml 有 bean abc。

4

2 回答 2

4

setAllowBeanDefinitionOverriding您可以通过调用和 pass禁用该功能以禁止 beanoverriding false。这必须在加载任何内容之前尽早完成。您需要为此创建自己的自定义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-param DispatcherServlet

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

从我的头上看,这应该禁用压倒一切的行为。如果您使用 springs WebApplicationInitializer 它更容易,因为您可能正在ApplicationContext自己构建,然后您可以直接调用该方法而无需ApplicationContextInitializer

链接

  1. ApplicationContextInitializer javadoc
  2. AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverriding javadoc
于 2013-09-27T09:01:59.293 回答
1

还:

  final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
  ctx.setAllowBeanDefinitionOverriding(false);
  ctx.setConfigLocations(shardContextImport);
  ctx.setParent(refreshedEvent.getApplicationContext());
  ctx.refresh();
于 2014-11-21T11:21:36.667 回答