gpt4 book ai didi

Spring:AnnotationConfigWebApplicationContext 如何无法覆盖以后的 bean?

转载 作者:行者123 更新时间:2023-12-04 06:23:40 25 4
gpt4 key购买 nike

我有一个使用 Sring IoC 框架的 Web 应用程序。
我使用 Spring 的 Java 配置,我只使用 @Configuration带注释的模块定义(代码中其他地方没有与 DI 相关的标签)。

由于 Spring 上下文加载监听器和 上下文配置位置 web.xml 中的参数配置为指向@Configuration 注释类。

这一切都很好,我得到了一个 AnnotationConfigWebApplicationContext。

现在,我想在我的应用程序中添加插件,它们将拥有自己的 @Configuration带注释的配置类,并将使用一些主要的应用程序服务。 但是 我不想修改主应用程序来加载这些新模块。

所以,我认为我可以简单地使用带注释的类的包搜索,但是现在,我似乎可以使用两个具有相同类型的 bean,即使它们具有不同的 id,并且显然 AnnotationConfigWebApplicationContext 文档指出:

Note: In case of multiple @Configuration classes, later @Bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra Configuration class.



我不希望这样,因为模块应该能够提供替代版本的服务,而不是(总是)覆盖现有的 - 特别是如果我想要一个“moduleDef”bean。

我尝试对此使用不同的方法,但是上下文和相关服务的层次结构对我来说太大了。

那么,有人知道我怎样才能达到我的目标吗?

谢谢

最佳答案

可以有多个 的 bean同类型 , 但你 不能有 2 个或更多带有 的 bean相同 ID 在单个 Spring ApplicationContext 中 - 无论您使用 XML 还是 JavaConfig。

覆盖机制与 bean ID 匹配,因此您需要做的就是确保唯一 ID,即:coreModuleDef , someOtherModuleDef , anotherModuleDef .我认为您不需要每个模块定义的 ID 相同吗?足够的类型是相同的,但不是 ID。

您也可以通过设置 allowBeanDefinitionOverriding 来关闭覆盖机制。至false在您的 AnnotationConfigWebApplicationContext如果您不小心覆盖了 bean,则获取异常:

public class MyDispatcherServlet extends DispatcherServlet {
@Override
protected void postProcessWebApplicationContext(
ConfigurableWebApplicationContext wac) {

((AnnotationConfigWebApplicationContext) wac)
.setAllowBeanDefinitionOverriding(false);
}
}

或者:
public class MyContextLoaderListener extends ContextLoaderListener {
@Override
protected void customizeContext(
ServletContext servletContext,
ConfigurableWebApplicationContext applicationContext) {

((AnnotationConfigWebApplicationContext) wac)
.setAllowBeanDefinitionOverriding(false);
}
}

关于Spring:AnnotationConfigWebApplicationContext 如何无法覆盖以后的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com