【问题标题】:Overriding the bean defined in parent context in a child context在子上下文中覆盖父上下文中定义的 bean
【发布时间】:2011-05-14 02:14:56
【问题描述】:

我们的应用需要支持多租户。每个已注册的客户都可能会覆盖 1 个或多个 bean 或在核心平台级别(通用代码/定义)定义的 bean 的某些属性。我想知道处理这个问题的最佳方法是什么。

【问题讨论】:

    标签: spring architecture jakarta-ee multi-tenant


    【解决方案1】:

    Spring 允许您多次重新定义同一个 bean 名称,并将为给定名称处理的最后一个 bean 定义作为获胜者。因此,例如,您可以有一个定义核心 bean 的 XML 文件,并将其导入到特定于客户端的 XML 文件中,该文件也重新定义了其中一些 bean。不过,它有点脆弱,因为没有专门说“这个 bean 定义是覆盖”的机制。

    我发现处理此问题的最简洁方法是使用new @Bean-syntax introduced in Spring 3。不是将 bean 定义为 XML,而是在 Java 中定义它们。因此,您的核心 bean 将在一个 @Bean-annotated 类中定义,并且您的客户端配置将继承该类,并覆盖适当的 bean。这允许您使用标准的 java @Override 注释,明确指示给定的 bean 定义正在被覆盖。

    【讨论】:

    • 您确定可以在子 ctx 中重新定义具有相同 id/name 的 bean 吗?
    • 看这个页面stackoverflow.com/tags/spring/topusers我想他知道他在说什么
    • 谢谢。我不是质疑他的帖子的正确性。正如我的开发资源告诉我的,这在 spring 的新版本(即 2.5.x 及更高版本)中是不可能的,我希望对该特定声明进行一些重新保证。他试图在具有相同名称的子上下文中重新定义 bean(在父上下文中定义),但在启动期间收到错误。
    • @Pangea:它记录警告,是的,但不记录异常。能给我们举个例子吗?
    • 有可能。而不是在这里讨论这个话题,你为什么不自己做一个简单的测试呢? :-P
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多