我注意到,如果您在两个 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。
我注意到,如果您在两个 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。
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
。
链接
还:
final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.setAllowBeanDefinitionOverriding(false);
ctx.setConfigLocations(shardContextImport);
ctx.setParent(refreshedEvent.getApplicationContext());
ctx.refresh();