给出以下控制器,
@Controller
public class MyController
{
...
@RequestMapping("/data")
public @RequestBody Data getData(@RequestParam String id)
{
return myCustomModel.queryForData(id);
}
}
配置它的正确方法是什么,以便MyController可以使用myCustomModel
(查询Data
的内容)?我已经看到了这种自动装配的好感,我也想这样做。
答案 0 :(得分:1)
对于生产代码,明确声明依赖关系而不是使用autowire是明智的,因此生产设置中的移动部件较少。
这类似于仅使用完全限定的导入语句而不是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);
}
}
答案 1 :(得分:0)
您的控制器永远不应该直接调用DAO层(如果您想进行某些事务,控制器层不支持它,原因很简单)。您必须注入一个服务(@Service)并从中调用一个服务方法,该方法可以在内部调用事务范围中的一个或多个DAO方法,并返回最终模式以供您发送到视图。