我想根据请求参数调用不同服务对象的方法。我现在有这个..
@Controller
public class HomeController {
@Autowired
AService aService;
@Autowired
BService bService;
@RequestMapping(value="home", method = RequestMethod.GET)
public String checkList(ModelMap modelMap, HttpServletRequest request){
String checkList = request.getParameter("listType");
if("listType" == "a")
modelMap.addAttribute("list", aService.getList());
if("listType" == "b")
modelMap.addAttribute("list", bService.getList());
return "checklist";
}
}
所以我想知道我是否可以使用反射方法来调用正确的服务对象而不是条件。我的意思是,我们之前有AService和BService实现了一个公共接口,并用这样的反射实例化正确的对象.. < / p>
String classname = (String) request.getAttribute("classname");
Class classref = Class.forName(classname);
Constructor c = classref.getConstructor(null);
ServiceInterface sI = c.newInstance(null);
但是对于Spring,我已经使用AutoWiring实例化了对象,那么有什么方法可以实现这个目标吗?
答案 0 :(得分:0)
反思几乎总是一个坏主意,也是OO设计不佳的标志。
为了避免使用if子句(恕我直言,除非重复次数太多,可维护,易读,易于理解,测试和调试),您可以将两个服务实例存储在地图中:
Map<String, ServiceInterface> services = new HashMap<String, ServiceInterface>();
services.put("a", aService);
services.put("b", bService);
//...
String checkList = request.getParameter("listType");
ServiceInterface service = this.services.get(checkList);
modelMap.addAttribute("list", service.getList());
如果在多个类中重复此操作,请将此映射放入名为ServiceInterfaceFactory
的单独Spring bean中,并包含方法ServiceInterface create(String checkList)
答案 1 :(得分:0)
如果可能,请使两个服务实现相同的接口,并编写一个实例化所需的工厂方法。