何时在Spring中使用构造函数注入?
我听说在使用组件之前绝对必须拥有依赖类的实例时,构造函数注入特别有用。但它是什么意思?
任何人都可以通过一些简单的例子向我解释以下时刻:
答案 0 :(得分:10)
正确的方法是尽可能使用构造函数注入。由于它清楚了什么是对象依赖项,如果您不提供所需的全部内容,则无法创建一个。
使用构造函数注入,如下所示。
public class ProjectService {
private final ProjectRepository projectRepository;
private final TaskRepository taskRepository;
public ProjectService(TaskRepository taskService, ProjectRepository projectService) {
Assert.notNull(taskService);
Assert.notNull(projectService);
this.taskRepository = taskService;
this.projectRepository = projectService;
}
public Project load(Long projectId) {
return projectRepository.findById(projectId);
}
}
final
字段确保在初始化对象后不会更改依赖关系Assert.notNull
确保您不会将空值替换为真实对象。使用setter注入或字段注入时,API允许您创建处于错误状态的对象。考虑一个例子:
public class ProjectService {
private ProjectRepository projectRepository;
private TaskRepository taskRepository;
public Project load(Long projectId) {
return projectRepository.findById(projectId);
}
@Autowired
public void setProjectRepository(ProjectRepository projectRepository) {
this.projectRepository = projectRepository;
}
@Autowired
public void setTaskRepository(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
}
ProjectService projectService = new ProjectService();
projectService.load(1L); // NullPointerException is thrown
对于所有非可选依赖项,您可以使用setter注入。 阅读有关Oliver Gierke(Spring Data lead)博客的更多信息:http://olivergierke.de/2013/11/why-field-injection-is-evil/
更新15.01.2019
从Spring 4.3开始,如果只存在单个构造函数,则无需在构造函数上添加@Autowired
注释。