2010-08-23 49 views
1

考虑下面的控制器,春季:将模型提供给控制器的正确方法?

@Controller 
public class MyController 
{ 
    ... 

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

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

+0

什么是'myCustomModel'?豆子? – skaffman 2010-08-23 18:57:05

+0

'@skaffman:'这是一个数据源。 – 2010-08-23 18:59:10

+0

你能描述一下你想如何工作吗?尝试将代码示例更改为更接近编译的内容。 – skaffman 2010-08-23 19:58:43

回答

0

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

1

对于生产代码,谨慎地声明依赖关系而不是使用自动装配,以便生产设置中的移动部件更少。 这类似于(顺便说一下自动装配集成测试一个非常有用的功能)只使用完全合格的import语句代替import my.super.project.dao.*

所以钩东西在生产,一个好办法的良好做法去只是普通的构造函数依赖注入到最后的领域。尽可能使用最终字段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); 
    } 
}