何时在Spring中使用构造函数注入?

时间:2014-11-25 16:52:46

标签: java spring constructor-injection

何时在Spring中使用构造函数注入

我听说在使用组件之前绝对必须拥有依赖类的实例时,构造函数注入特别有用。但它是什么意思?

任何人都可以通过一些简单的例子向我解释以下时刻:

  • 使用构造函数注入可以获得哪些好处?
  • 什么是动态构造函数注入?

1 个答案:

答案 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注释。