如何停止在 Spring 中覆盖 bean

2023-12-03

我注意到,如果您在两个 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

  1. 应用程序上下文初始化器javadoc
  2. AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverridingjavadoc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何停止在 Spring 中覆盖 bean 的相关文章

随机推荐