在春季动态选择服务实现
问题内容:
我正在使用Spring 3.2,并希望根据条件在控制器中动态选择服务实现。考虑我有一个接口和两个实现,如下所示:
public interface DevService {
public void add(Device device);
}
public class DevServiceImpl implements DevService {
public void add(Device device) {
}
}
public class RemoteDevServiceImpl implements DevService {
public void add(Device device) {
}
}
因此,在我的控制器中,根据是在本地站点还是在远程站点上执行该操作,我需要在本地执行该命令或向该远程站点发送命令以执行该操作。本质上,用户单击的站点确定了要调用的服务隐式。有人可以提出一种干净的方法来实现这一目标吗?
问题答案:
假设您在生产环境中都需要两种实现(如果不需要,请使用Spring概要文件在环境之间明确拆分bean)。简单的方法是:
interface DevService
{
void add(Device d);
String getName();
}
@Service("devServiceLocal")
class DevServiceLocalImpl implements DevService
{
void add(Device d) {...}
String getName() {return "local";}
}
class Controller
{
@Autowired
Collection<DevService> services;
void doSomethingWithService()
{
// TODO: Check type somehow
String servType = "local";
for(DevService s: services)
{
if(servType.equals(s.getName())
{
// Call service methods
break;
}
}
}
}