我让对象进入REST web service controller's
网络方法,该方法已在本地初始化。
@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
以使用factory实例化依赖关系。
已经定义了不同的代码类来实现BaseCode接口。
如何使用工厂方法基于我的服务bean中以BaseCode类型的代码值来实例化特定代码类?
有什么想法吗?提前谢谢。
答案 0 :(得分:1)
在这种情况下我通常做的是:
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评论。如果你有ThisBaseCodeImpl
使用其他Spring bean,你可以
@Configurable
注释它,因此,当您使用new ThisBaseCodeImpl(/*args if you like*/)
时,它的bean将由Spring实例化。我个人并不喜欢这个解决方案,因为在我看来,它会隐藏Spring的bean污染代码。另一方面,它非常灵活,因为它允许您管理运行时构造函数参数和Spring bean ThisBaseCodeImpl
添加到Spring上下文并更改工厂,以便将ThisBaseCodeImpl
的协作者注入其中。第1点示例:
@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
}
}
答案 1 :(得分:0)
我不确定我是否理解你的问题,但一般来说,春天的依赖关系在这里无关。只需编写自定义Factory类并根据reqObj.getcode()返回BaseCode实现。
答案 2 :(得分:0)
我是这样做的 -
以获得currentContext的方式将工厂设为ServletContextAware
。并将getInstance方法定义为
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
ctx.getBean(classNameToBeInstantiated);
在spring上下文中定义bean的继承,以便Spring注入其依赖项。