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

Java 何时在Spring中使用构造函数注入?,java,spring,constructor-injection,Java,Spring,Constructor Injection,何时在Spring中使用构造函数注入 我听说,当您在使用组件之前必须拥有依赖类的实例时,构造函数注入特别有用。但这意味着什么 有谁能给我举几个简单的例子来解释以下时刻: 使用构造函数注入有什么好处 什么是动态构造函数注入 正确的方法是尽可能使用构造函数注入。由于这一点,很清楚什么是对象依赖关系,如果不提供所需的全部内容,则无法创建对象依赖关系 使用构造函数注入,如下所示 public class ProjectService { private final ProjectReposit

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

我听说,当您在使用组件之前必须拥有依赖类的实例时,构造函数注入特别有用。但这意味着什么

有谁能给我举几个简单的例子来解释以下时刻:

  • 使用构造函数注入有什么好处
  • 什么是动态构造函数注入

    • 正确的方法是尽可能使用构造函数注入。由于这一点,很清楚什么是对象依赖关系,如果不提供所需的全部内容,则无法创建对象依赖关系

      使用构造函数注入,如下所示

      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;
          }
      }
      
      对于所有非可选依赖项,可以使用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