Java 豆荚豆和同类型的豆荚豆
我有两个实现我的服务接口的服务,我想在运行时根据一些规则选择正确的服务,例如:Java 豆荚豆和同类型的豆荚豆,java,spring,Java,Spring,我有两个实现我的服务接口的服务,我想在运行时根据一些规则选择正确的服务,例如: public interface Service { public String doSomething(String param); } @Component("serviceAimpl") public class ServiceAImpl implements Service{ public String doSomething(String param){ return par
public interface Service { public String doSomething(String param); }
@Component("serviceAimpl")
public class ServiceAImpl implements Service{
public String doSomething(String param){
return param + "A";
}
}
@Component("serviceBimpl")
public class ServiceBImpl implements Service{
public String doSomething(String param){
return param;
}
}
当参数以“1”开头时必须使用ServiceAImpl,否则必须使用ServiceBImpl,是否有任何方法可以执行上述操作:
@Component public class ServiceImpl implements Service {
@Autowired private Map<String, Service> services;
public String doSomething(String param) {
if(param.startsWith("1")
return services.get("serviceAimpl").doSomething(param);
else
return services.get("serviceBimpl").doSomething(param);
}
}
@组件公共类ServiceImpl实现服务{
@自动连线私人地图服务;
公共字符串doSomething(字符串参数){
if(参数起始值为(“1”)
return services.get(“serviceAimpl”).doSomething(参数);
其他的
return services.get(“serviceBimpl”).doSomething(param);
}
}
这样,工厂与bean本身的类型相同,因此无需创建新类型来获取bean,然后使用bean。这在spring中是否有效?是否有任何方法或约定来执行上述操作(忽略Im仅在那里连接字符串的事实)?我认为您可以使用两个独立的
@Autowired
属性,如下所示:
@Service("serviceAimpl")
public class ServiceAImpl implements Service{
public String doSomething(String param){
return param + "A";
}
}
@Service("serviceBimpl")
public class ServiceBImpl implements Service{
public String doSomething(String param){
return param;
}
}
@Service("mainService")
public class ServiceImpl {
@Autowired
private ServiceAImpl serviceAimpl;
@Autowired
private ServiceBImpl serviceBimpl;
public String doSomething(String param) {
if(param.startsWith("1")
return this.serviceAimpl.doSomething(param);
else
return this.serviceBimpl.doSomething(param);
}
}
编辑:如果要自动关联地图、列表,这里的一些属性集很有趣。我认为您可以使用两个单独的
@Autowired
属性,如下所示:
@Service("serviceAimpl")
public class ServiceAImpl implements Service{
public String doSomething(String param){
return param + "A";
}
}
@Service("serviceBimpl")
public class ServiceBImpl implements Service{
public String doSomething(String param){
return param;
}
}
@Service("mainService")
public class ServiceImpl {
@Autowired
private ServiceAImpl serviceAimpl;
@Autowired
private ServiceBImpl serviceBimpl;
public String doSomething(String param) {
if(param.startsWith("1")
return this.serviceAimpl.doSomething(param);
else
return this.serviceBimpl.doSomething(param);
}
}
编辑:如果您想自动关联地图、列表,这里的一些属性集是一个有趣的问题。Nikol提供了一个很好的解决方案,我也会这样做。但我不完全了解您的要求,所以您可能对下面的选项感兴趣 即使是类型化映射也可以自动连接,只要所需的键类型是字符串。映射值将包含所需类型的所有bean,并且键将包含相应的bean名称: 因此,可以获取bean名称和bean,并按照您想要的方式使用它
@Autowired
private Map<String, Service > services;
if(somecondition)
services.get("serviceAimpl"). doSomething();
else
services.get("ServiceBImpl"). doSomething()
@Autowired
私人地图服务;
如果(某些条件)
services.get(“serviceAimpl”).doSomething();
其他的
services.get(“ServiceBImpl”).doSomething()
Nikol提供了一个很好的解决方案,我也会这么做。但我并不完全了解您的需求,所以您可能也对以下选项感兴趣
即使是类型化映射也可以自动连接,只要所需的键类型是字符串。映射值将包含所需类型的所有bean,并且键将包含相应的bean名称:
因此,可以获取bean名称和bean,并按照您想要的方式使用它
@Autowired
private Map<String, Service > services;
if(somecondition)
services.get("serviceAimpl"). doSomething();
else
services.get("ServiceBImpl"). doSomething()
@Autowired
私人地图服务;
如果(某些条件)
services.get(“serviceAimpl”).doSomething();
其他的
services.get(“ServiceBImpl”).doSomething()
谢谢,这篇文章帮助了我做了很多我正在搜索的事情,那就是用spring的方式使用复合模式(在写问题时不知道名称)。谢谢,这篇文章帮助了我做了很多我正在搜索的事情,那就是使用复合模式(在写问题时不知道名称)以春天的方式。