当前位置: 首页 > 知识库问答 >
问题:

什么时候在Spring中使用构造函数注入?[重复]

顾英发
2023-03-14

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

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

有没有人可以用一些简单的例子来解释我以下的时刻:

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

共有1个答案

仲孙凡
2023-03-14

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

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

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);
    }
}
  • 最终字段确保在对象初始化后不更改依赖项
  • ssert.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

从Spring4.3开始,如果只存在一个构造函数,则无需在构造函数上添加@Autowired注释。

 类似资料:
  • 问题内容: 我了解OOP语言(例如C ++)中的构造函数的概念。但是,我不确定何时在REACT中使用构造函数。我确实了解JavaScript是面向对象的,但是我不确定构造器实际上是在“构造”什么。 呈现子组件时,子组件中是否需要构造函数?例如: 为了简洁起见,我将简短示例。但是,为什么需要构造函数?您是否需要在子组件中使用一个构造函数来构造道具? 我的ES6知识很可能还没有达到标准。 问题答案:

  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 创建名为“Greeting Service”的bean时出错:通过构造函数实例化bean失败;嵌套异常是org.springframework.beans.BeanInstantiationException:未能实例化[GreetingService]:构造函数抛出异常;嵌套异常是org.springframework.beans.factory.NosuchBeanDefinitionExce

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 问题内容: 我在这里找不到任何合理的答案,所以我希望它不会重复。那么为什么我应该更喜欢setter或构造函数注入而不是简单注入 如果您在类初始化期间需要对注入的bean进行某些操作,则可以使用构造函数注入的用法 但是仍然,它几乎和方法一样,并且我完全不会进行setter注入,这不只是Spring和其他DI框架之后的遗物吗? 问题答案: 构造函数和属性注入使您可以轻松地在非CDI环境中(例如,单元测

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。