【发布时间】:2018-08-07 04:28:57
【问题描述】:
如何在没有 if else 条件的情况下选择依赖项。
假设我有一个接口:
public interface A{
String doSomething(String req);
}
有两个服务实现A:
@Component
public class FirstImpl implements A{
@override
String doSomething(String req){
return "something";
}
}
和:
@Component
public class SecondImpl implements A{
@override
String doSomething(String req){
return "something";
}
}
现在我创建一个 AdapterService 类:
@Component
public class AdapterService{
@Autowired
private FirstImpl first;
@Autowired
private SecondImpl second;
public getService(String name){
if("name".equals("First")){
return first;
}else if("name".equals("Second")){
return second;
}
}
}
现在调用实现:
@Service
public class BusinessService{
@Autowired
private AdapterService adapterService;
void doSomething(String name,String req){
return adapterService.getService(name).doSomething();
}
}
现在,如果我需要创建另一个实现 A 的类,则需要在 ServiceAdapter 类中添加条件。像"Third".equals(name) 一样返回另一个注入的服务。对于每个新服务,都需要添加另一个 if else 条件并注入相应的服务。我怎样才能避免这个适配器类。 Spring 从名称中动态选择依赖关系。
【问题讨论】:
-
如果您可以访问 applicationContext 对象,您可以调用 applicationContext.getBean(name) 并完全避免使用 ServiceAdapter 类。唯一的问题是您需要将这些豆子放在容器中。
-
@RishikeshDhokare 是绝对正确的,如果您可以按照代码所期望的方式命名您的 bean,或者只需在
A中创建一个名为 getName() 的函数。然后在您的BusinessService类中,您可以注入List<A>并从中创建一个Map<String,A>。 -
为什么要创建地图
? -
你没有得到他的解决方案。
-
@rishikeshdhokare 谢谢。它有效
标签: java spring spring-boot design-patterns dependency-injection