我注意到如果你在两个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都应该是唯一的。
答案 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 :(得分:1)
此外:
final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.setAllowBeanDefinitionOverriding(false);
ctx.setConfigLocations(shardContextImport);
ctx.setParent(refreshedEvent.getApplicationContext());
ctx.refresh();