在子上下文中覆盖父上下文中定义的bean

22
我们的应用程序需要支持多租户。每个入驻客户都可能覆盖一个或多个核心平台层(通用代码/定义)上定义的bean或bean的某些属性。我想知道处理这种情况的最佳方式是什么。
1个回答

33
Spring允许您多次重新定义同一个bean名称,并且对于给定名称处理的最后一个bean定义将成为获胜者。例如,您可以有一个XML文件定义核心bean,并在特定于客户端的XML文件中导入它,并重新定义其中一些bean。但这种方法有点脆弱,因为没有机制明确地说“此bean定义是覆盖”。
我发现使用Spring 3中引入的新的@Bean语法处理这个问题是最清晰的方式。而不是将bean定义为XML,您可以在Java中定义它们。因此,您的核心bean将在一个@ Bean注释类中定义,您的客户端配置将继承该类,并覆盖适当的bean。这允许您使用标准java @ Override注释,明确指示正在覆盖给定的bean定义。

你确定在子上下文中可以重新定义具有相同ID/名称的bean吗? - Aravind Yarram
9
看着这个页面http://stackoverflow.com/tags/spring/topusers ,我认为他知道自己在说什么。 - Sean Patrick Floyd
谢谢。我不是在质疑他的帖子的正确性。我想要一些关于那个特定语句的再保证,因为我的开发资源告诉我在新版本的Spring中(即2.5.x及更高版本)这是不可能的。他尝试在子上下文中重新定义与父上下文中相同名称的bean(该bean已在父上下文中定义),但在启动期间收到了错误。 - Aravind Yarram
4
可以的。为什么不直接进行一个简单的测试,自己亲身体验一下呢?不必在这里讨论这个话题。:-P - Neeme Praks
这个不起作用。我之前一直以为这种方法是可行的,但实际上,Spring是根据配置文件的路径(包名+类名)的顺序覆盖Bean的。因此,基本上只要确保您的覆盖配置文件在主文件之后(按字母顺序排列),就可以了。 - Shivankur Pal
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接