如何根据租户在运行时选择d簧配置?

如何根据租户在运行时选择d簧配置?,第1张

概述我希望能够根据用户在运行时所属的租户选择特定的Spring(或Grails)上下文配置.假设我使用Spring Security并在登录期间检索tenantId.想象一下,现在我有两个租户,他们支付不同的佣金.如何在没有太多管道的情况下将特定服务注入控制器?这是两个不同的背景.所以,我应该根据租户注入不同的ExchangeService.@Configura

我希望能够根据用户在运行时所属的租户选择特定的Spring(或Grails)上下文配置.假设我使用Spring Security并在登录期间检索tenantID.
想象一下,现在我有两个租户,他们支付不同的佣金.如何在没有太多管道的情况下将特定服务注入控制器?这是两个不同的背景.所以,我应该根据租户注入不同的ExchangeService.

@Configurationpublic class FooTenant{@Beanpublic ExchangeService bar() {  return new ZeroCommisionExchangeService ();  }}@Configurationpublic class barTenant{@Beanpublic ExchangeService bar() {  return new StandardCommisionExchangeService ();  }}

编辑:
我知道我可以获得对Spring上下文的引用并“手动”请求服务,但我正在寻找一个更通用的解决方案,其中这个问题由IoC框架解决.最佳答案几年前我们需要这样的东西,但仅限于DataSources和VIEwResolvers.我们使用spring’TargetSource解决方案开发了一个解决方案(最初我们使用了HotswappableTargetSource,但这对我们的用例来说还不够.

我们开发的代码在多租户目录中可用于here.

它完全可配置且灵活.

基本上你要做的就是配置一个ContextSwappableTargetSource并告诉它需要返回什么类型的接口/类.

默认是基于tenantID在ApplicationContext中查找bean(请参阅beanfactoryTargetRegistry).但是,您可以指定其中的一个或多个(我们使用JndiLookupTargetRegistry动态查找数据源,这允许在不重新启动应用程序的情况下动态添加租户).

如果显式配置beanfactoryTargetRegistry,则可以添加前缀和后缀.

现在,对于foo,它将查找名为fooExchangeService的bean和bar barExchangeService.

tenantID存储在ThreadLocal中,该ThreadLocal包含在ContextHolder中.你需要找到一种填充和清除本地线程的方法(一般来说,servlet Filter就是这样做的.

在您的代码中,您现在可以简单地使用ExchangeService接口,并在运行时基于tenantID查找正确的实现.

另见http://mdeinum.wordpress.com/2007/01/05/one-application-per-client-database/ 总结

以上是内存溢出为你收集整理的如何根据租户在运行时选择d簧配置?全部内容,希望文章能够帮你解决如何根据租户在运行时选择d簧配置?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1248567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)