Java 何时在Spring中使用构造函数注入?
何时在Spring中使用构造函数注入 我听说,当您在使用组件之前必须拥有依赖类的实例时,构造函数注入特别有用。但这意味着什么 有谁能给我举几个简单的例子来解释以下时刻:Java 何时在Spring中使用构造函数注入?,java,spring,constructor-injection,Java,Spring,Constructor Injection,何时在Spring中使用构造函数注入 我听说,当您在使用组件之前必须拥有依赖类的实例时,构造函数注入特别有用。但这意味着什么 有谁能给我举几个简单的例子来解释以下时刻: 使用构造函数注入有什么好处 什么是动态构造函数注入 正确的方法是尽可能使用构造函数注入。由于这一点,很清楚什么是对象依赖关系,如果不提供所需的全部内容,则无法创建对象依赖关系 使用构造函数注入,如下所示 public class ProjectService { private final ProjectReposit
- 使用构造函数注入有什么好处李>
- 什么是动态构造函数注入
- 正确的方法是尽可能使用构造函数注入。由于这一点,很清楚什么是对象依赖关系,如果不提供所需的全部内容,则无法创建对象依赖关系
使用构造函数注入,如下所示
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
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;
}
}
对于所有非可选依赖项,可以使用setter注入。
在Oliver Gierke(Spring Data lead)博客上阅读更多内容:
更新日期:2019年1月15日
从Spring 4.3开始,如果只存在一个构造函数,则无需在构造函数上添加
@Autowired
注释。注入构造函数也允许您具有最终依赖性。虽然我同意final
字段的有用性,但Assert.notNull
可以在setter中轻松完成。只有当某人愚蠢到试图手工构造bean时,API示例才会发生。实际上,Assert.notNull
也可以在setter中完成——我发布了一个完整的示例,说明了我认为Java类在构造方面应该是什么样子。如果您的类是公共的,并且您想要构建好的API,那么您应该知道它也可以在Spring上下文之外使用——简单的例子是单元测试。任何合适的单元测试框架都可以构造具有模拟依赖关系的bean。如果bean应该在任何上下文中工作,那么最好的选择是工厂,而不是显式构造。面向对象编程的原则之一是确保对象始终处于正确的状态。通过构造函数注入,您可以显式地显示使对象实际工作的所需依赖项。这是一个很好的做法,让你避免NPE和困惑在未来。我同意这个答案,另外你可以检查这篇文章,帮助了我很多
ProjectService projectService = new ProjectService();
projectService.load(1L); // NullPointerException is thrown