java - 如何使用 DI 基于 String 动态选择要执行的服务?

标签 java spring dependency-injection

我有一个字符串作为输入,基于此我想选择一个服务来执行。

对于以下方法,我有一个委托(delegate)类,它使用 Spring 4 自动注入(inject)所有可能的服务。但可以改善这一点吗?或者这是委托(delegate)特定服务的好方法吗?

特别是我不知道是否注入(inject)我可以根据此类中的操作选择的所有服务。

class Delegator {
    public MyService findService(String action) {
        switch (action) {
            case "A": return serviceA; break;
            case "B": return serviceB; break;
            //lots of other cases
        }
        return null; 
    }

    @Autowired
    private MyService serviceA;

    @Autowired
    private MyService serviceB;
}

最佳答案

我想您可能有几种解决方案,最简单的是在 MyService 接口(interface)上创建回调方法,然后您可以迭代所有 MyService 实现并找出哪一个使用(即在支持时从指定方法返回 true)。

class Delegator {

    @Autowired
    private List<MyService> services;

    public MyService findService(String action) {
        for (MyService service : services) {
            if (service.canHandle(action) ) {
                return service
            }
        }
        throw new IllegalArgumentException("Could not find service to handle: "+action);
    }

}

这允许您添加 MyService 实现,而无需修改 Delegator 类。

相关/类似的解决方案可能是使用 @Qualifier 注释,而不是在 MyService 实现上添加回调方法。您的 Delegator 必须了解 springs ApplicationContext ,以便您可以查找所需的 bean。 @Qualifier 当然会与传入的 action 方法参数匹配/相关。

class Delegator {

    @Autowired
    private BeanFactory bf;

    public MyService findService(String action) {
        return BeanFactoryAnnotationUtils.qualifiedBeanOfType(bf, MyService.class, action);
    }

}

@Service
@Qualifier("foo")
public MyService1 implements MyService { ... }

@Service
@Qualifier("bar")
public MyService2 implements MyService { ... }

对于与 foo 匹配的 action,将返回带有 @Qualifier foo 的 bean。如果找不到匹配的实现,您将收到 NoSuchBeanDefinitionException

关于java - 如何使用 DI 基于 String 动态选择要执行的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383056/

相关文章:

jquery - 如何使用 Spring MVC 在 session 中保存字符串?

java - 为什么 tuckey UrlRewriteFilter 出站规则映射不起作用?

java - 该页面没有正确重定向 Spring Security

spring - 如何让 Spring Batch 在一段时间后重试失败的步骤?

java - 将工厂模式转换为 Guice 模块

c# - 在 Silverlight 和 MVVM 的组合根中保持 DI 容器的使用

java - 将大文件拆分成 block

java - 每个实体一个 DAO——如何处理引用?

java - 使用 Git 的 maven war 插件的可配置输出目录

entity-framework - 在类库中注册容器(IoC)?