首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Spring 3中使用工厂模式实例化bean

在Spring 3中使用工厂模式实例化bean
EN

Stack Overflow用户
提问于 2013-12-16 17:50:41
回答 3查看 1.7K关注 0票数 1

我得到了一个本地初始化的REST web service controller's web方法中的对象。

代码语言:javascript
运行
复制
@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类型输入的代码值实例化特定的代码类?

有什么想法吗?提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-17 15:57:11

我就是这样做的-

让你的工厂成为ServletContextAware,这样就可以得到currentContext。并将getInstance方法定义为

代码语言:javascript
运行
复制
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

ctx.getBean(classNameToBeInstantiated);

在spring上下文中定义bean的继承,以便Spring注入它的依赖项。

票数 0
EN

Stack Overflow用户

发布于 2013-12-16 18:19:36

在这种情况下,我通常做的是:

  1. 使用Spring的bean将工厂注入控制器。
  2. 在工厂中创建一个方法getBaseCode(String code) (请注意:String在这里表示代码类型,所以如果不是String,请使用实际的代码类型
  3. 使getBaseCode在构建实际实现时返回BaseCode接口
  4. 假设您在execute中有一个BaseCode方法,那么在控制器中使用getBaseCode方法来获得真正的协作者,然后调用execute方法来执行实际的操作。

忽略第一点(我认为您可以轻松地查看任何Spring教程),工厂将类似于

代码语言:javascript
运行
复制
public class BaseCodeFactory {
  public BaseCode getBaseCode(String code) {
    if(code.equals("something")) return new ThisBaseCodeImpl();
    else //and so on
  }
}

computeDetails变得类似于:

代码语言:javascript
运行
复制
@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,则可以

  1. @Configurable注释它,所以当您使用new ThisBaseCodeImpl(/*args if you like*/)时,它的bean被Spring实例化。我个人不喜欢这个解决方案,因为在我看来,它用隐藏的Spring的bean污染代码。另一方面,它非常灵活,因为它允许您同时管理运行时构造器参数和Spring
  2. ThisBaseCodeImpl添加到Spring上下文并更改工厂,以便将ThisBaseCodeImpl的协作者注入其中。

第一点示例:

代码语言:javascript
运行
复制
@Configurable
public class ThisBaseCodeImpl {
  @Resource
  private Bean bean;
}

第二点示例:

代码语言:javascript
运行
复制
public class BaseCodeFactory {
  @Resource
  ThisBaseCodeImpl thisBaseCodeImpl;

  public BaseCode getBaseCode(String code) {
    if(code.equals("something")) return thisBaseCodeImpl;
    else //and so on
  }
}
票数 1
EN

Stack Overflow用户

发布于 2013-12-16 18:08:26

我不确定我是否很好地理解了您的问题,但是总的来说,spring依赖关系在这里没有任何意义。只需编写自定义工厂类并根据BaseCode ()返回reqObj.getcode实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20617396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档