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的方式使用复合模式(在写问题时不知道名称)。谢谢,这篇文章帮助了我做了很多我正在搜索的事情,那就是使用复合模式(在写问题时不知道名称)以春天的方式。