我得到了一个本地初始化的REST web service controller's web方法中的对象。
@RequestMapping(method = RequestMethod.POST,value = "/test",headers="Accept=*/*")
public @ResponseBody ModelAndView computeDetails(@RequestBody RequestObj reqObj, ModelMap model) {
System.out.println(reqObj.getcode());
return new ModelAndView("responsedetails", "object", reqObj);
}此RequestObj对象保存使用工厂实例化依赖关系的键code。
定义了实现BaseCode接口的不同代码类。
如何使用工厂方法根据服务bean中以BaseCode类型输入的代码值实例化特定的代码类?
有什么想法吗?提前谢谢。
发布于 2013-12-17 15:57:11
我就是这样做的-
让你的工厂成为ServletContextAware,这样就可以得到currentContext。并将getInstance方法定义为
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
ctx.getBean(classNameToBeInstantiated);在spring上下文中定义bean的继承,以便Spring注入它的依赖项。
发布于 2013-12-16 18:19:36
在这种情况下,我通常做的是:
Spring的bean将工厂注入控制器。getBaseCode(String code) (请注意:String在这里表示代码类型,所以如果不是String,请使用实际的代码类型getBaseCode在构建实际实现时返回BaseCode接口execute中有一个BaseCode方法,那么在控制器中使用getBaseCode方法来获得真正的协作者,然后调用execute方法来执行实际的操作。忽略第一点(我认为您可以轻松地查看任何Spring教程),工厂将类似于
public class BaseCodeFactory {
public BaseCode getBaseCode(String code) {
if(code.equals("something")) return new ThisBaseCodeImpl();
else //and so on
}
}当computeDetails变得类似于:
@RequestMapping(method = RequestMethod.POST,value = "/test",headers="Accept=*/*")
public @ResponseBody ModelAndView computeDetails(@RequestBody RequestObj reqObj, ModelMap model) {
//...
factory.getBaseCode(reqObj.getcode()).execute();
//...
}作为附带说明,我不会选择像我在这里选择的名字,我建议您在您的领域中寻找更有意义的东西(例如,BaseCode没有任何意义),把这个片段当作一个指令。
基于OP注释。如果您有利用其他Spring的ThisBaseCodeImpl,则可以
@Configurable注释它,所以当您使用new ThisBaseCodeImpl(/*args if you like*/)时,它的bean被Spring实例化。我个人不喜欢这个解决方案,因为在我看来,它用隐藏的Spring的bean污染代码。另一方面,它非常灵活,因为它允许您同时管理运行时构造器参数和SpringThisBaseCodeImpl添加到Spring上下文并更改工厂,以便将ThisBaseCodeImpl的协作者注入其中。第一点示例:
@Configurable
public class ThisBaseCodeImpl {
@Resource
private Bean bean;
}第二点示例:
public class BaseCodeFactory {
@Resource
ThisBaseCodeImpl thisBaseCodeImpl;
public BaseCode getBaseCode(String code) {
if(code.equals("something")) return thisBaseCodeImpl;
else //and so on
}
}发布于 2013-12-16 18:08:26
我不确定我是否很好地理解了您的问题,但是总的来说,spring依赖关系在这里没有任何意义。只需编写自定义工厂类并根据BaseCode ()返回reqObj.getcode实现。
https://stackoverflow.com/questions/20617396
复制相似问题