java - Spring - 两个实现之间的运行时选择

标签 java spring dependency-injection

假设我有一个依赖于LittleServiceHigherLevelBeanLittleService 是一个具有两个实现的接口(interface)。

没有静态或半静态的方式来判断应该使用这两个实现中的哪一个,它都是动态的(实际上是 session 范围的)。当来自该用户的请求进入时使用 LegacyLittleService,而对于来自该用户的请求使用 NewShinyLittleService

服务不会那么小。它们将有自己的需要注入(inject)的依赖项,并且它们可能来自两个不同的应用程序上下文。考虑在两种不同的模式/数据模型上使用一个应用。

我怎样才能实现这种运行时动态?理想情况下使用注释驱动的配置。我有哪些选择,它们的优缺点?

最佳答案

您可以简单地拥有一个工厂,其中注入(inject)了两种服务:

@Component
public class LittleServiceFactory {
    @Autowired
    private LegacyLittleService legacy;

    @Autowired
    private NewShinyLittleService newShiny;

    @Autowired
    private TheSessionScopedBean theSessionScopedBean;

    public LittleService get() {
        if (theSessionScopedBean.shouldUseLegacy()) {
            return legacy;
        }
        else {
            return newShiny;
        }
    }
}

现在将这个工厂注入(inject)到任何你想要的地方,并调用 get() 来访问适当的 LittleService 实例。

关于java - Spring - 两个实现之间的运行时选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21957844/

相关文章:

java - 在 Hibernate 之前运行 SpringLiquibase

java - 如果里面 while

java - "prototype"bean如何让Spring只在getBean()获取到时才初始化?

java - @DateTimeFormat 转换时出现夏令时错误

java - 在类型为 'name' 的对象上找不到属性或字段 'java.util.Optional' - 可能不是公开的或无效的?

c# - 当服务具有其他依赖项时,无法让注入(inject)在 Azure Functions 中工作

java - 复选框值为 true 但勾号未显示 - Android/Java

java - Spring boot 无法验证新建立的连接

dependency-injection - 统一: Implicit ResolvedParameter for unnamed registrations

java - spring如何将方法调用解析为bean?