如果没有其他条件,我如何选择依赖关系。
假设我有一个接口:
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)
返回另一个注入的服务。对于每个新服务,需要添加其他条件,然后注入相应的服务。我如何避免这种Adapter类。 Spring从名称中动态选择依赖关系。 最佳答案
如果您有权访问applicationContext
对象,则可以调用
applicationContext.getBean(名称)
并完全避免使用ServiceAdapter类。唯一的事情是您需要将那些bean放入容器中。
试试这个:
@Component
public class AdapterService{
@Autowired
private ApplicationContext applicationContext;
public A getService(String name){
return applicationContext.getBean(name,A.class);
}
}