【问题标题】:Spring: Proper way to make the Model available to the Controller?Spring:使模型对控制器可用的正确方法?
【发布时间】:2010-08-23 18:48:07
【问题描述】:

给定以下控制器,

@Controller
public class MyController 
{
    ...

    @RequestMapping("/data")
    public @RequestBody Data getData(@RequestParam String id) 
    {
        return myCustomModel.queryForData(id);
    }
}

什么是配置它的正确方法,以便 MyController 可以使用 myCustomModel(查询 Data 的东西)?我已经看到了这种对自动装配的幻想,我也想这样做。

【问题讨论】:

  • 什么是myCustomModel?一颗豆子?
  • @skaffman: 是数据源。
  • 您能描述一下您希望它如何工作吗?尝试将代码示例更改为更接近编译的内容。

标签: java spring model spring-mvc controller


【解决方案1】:

对于生产代码,明确声明依赖项而不是使用自动装配是谨慎的做法,这样生产设置中的活动部件就会更少。 这类似于仅使用完全限定的导入语句而不是 import my.super.project.dao.*

的良好做法

(顺便说一下,自动装配对于集成测试来说是一个非常有用的功能)

所以要在生产环境中连接,一个好方法就是将普通的旧构造函数依赖注入到 final 字段中。尽可能使用 final 字段minimizes mutability

服务类,通过注入接收daos:

public class CompanyService implements ICompanyService {

   private final EmployeeDao employeeDao;
   private final DepartmentDao departmentDao;

   public CompanyService(EmployeeDao employeeDao, DepartmentDao departmentDao) {

     this.employeeDao = employeeDao;
     this.departmentDao = departmentDao;
   }

   ...
}

然后控制器通过注入(使用接口类型)接收服务:

@Controller
public class MyController 
{
    private final ICompanyService companyService;

    public MyController(ICompanyService companyService) {
      this.companyService = companyService;
    }

    @RequestMapping("/data")
    public @RequestBody Data getData(@RequestParam String id) 
    {
        return companyService.queryForData(id);
    }
}

【讨论】:

    【解决方案2】:

    您的控制器不应该直接调用 DAO 层(原因很简单,如果您想做一些事务,您的控制器层不支持它)。您必须注入一个服务 (@Service) 并从中调用一个服务方法,该方法可以在事务范围内内部调用一个或多个 DAO 方法并返回最终模态供您发送到视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多