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

时间:2013-12-16 17:50:41

标签: java rest spring-mvc factory-pattern

我让对象进入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类型的代码值来实例化特定代码类?

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

3 个答案:

答案 0 :(得分:1)

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

  1. 使用Spring的bean
  2. 将工厂注入控制器
  3. 在工厂中创建方法getBaseCode(String code)(请注意:String此处代表代码类型,因此如果不是String
  4. ,请使用实际代码类型
  5. 在构建实际实现时让getBaseCode返回BaseCode接口
  6. 假设您在execute中有BaseCode方法,请使用getBaseCode方法进入控制器以获取真正的协作者,然后调用execute方法来执行实际操作行动

  7. 忽略第一点(我认为你可以轻松查看任何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,你可以

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