我注意到,如果您在两个 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,都应该是唯一的。
您可以通过调用来禁用该功能以禁止 beanoverridingsetAllowBeanDefinitionOverriding
并通过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
使用初始化参数DispatcherServlet
需要的时候)
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>your.package.here.OverrideDisablingApplicationContextInitializer<param-value>
</context-param>
从我的想法来看,这应该禁用最重要的行为。如果您使用 springs WebApplicationInitializer 它会更容易,因为您可能正在构建ApplicationContext
你自己,然后你可以直接调用该方法,而不需要ApplicationContextInitializer
是需要的。
Links
- 应用程序上下文初始化器javadoc
- AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverridingjavadoc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)