在春季动态选择服务实现


问题内容

我正在使用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;
         }
      }
   }
}