我有一个字符串作为输入,基于此我想选择一个服务
来执行。
对于以下方法,我有一个委托(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/