【问题标题】:How does Dependency Injection work in this case?在这种情况下,依赖注入如何工作?
【发布时间】:2021-03-01 09:58:19
【问题描述】:

在 Spring Boot Web 应用程序布局中,我定义了一个名为 ApplicationUserService 的服务接口。一个名为ApplicationUserServiceImpl 的实现实现了ApplicationUserService 中存在的所有方法。

现在,我有一个名为 ApplicationUserController 的控制器,它在不同的 @GetMapping 注释下调用 ApplicationUserServiceImpl 的所有方法。

按照我的导师的建议,我定义了一个依赖注入如下:

public class ApplicationUserController {

    private final ApplicationUserService applicationUserService; //This variable will work as an object now.

    public ApplicationUserController(ApplicationUserService applicationUserService) {
        this.applicationUserService = applicationUserService;
    }

@GetMapping
//REST OF THE CODE

}

我是 Spring Boot 的新手,我尝试用简单的英语理解依赖注入,我理解它是如何工作的。我理解基本思想是将依赖与使用分开。但我完全不知道这在我的情况下是如何工作的。

我的问题:

  1. 这里 ApplicationUserService 是一个接口,它的实现定义了各种方法。在上面的代码中,applicationUserService 现在可以访问来自ApplicationUserServiceImpl 的每个方法。这是怎么发生的?
  2. 我想知道这里的对象创建是如何工作的。
  3. 您能告诉我在这种情况下不使用 DI 和使用 DI 的区别吗?

【问题讨论】:

    标签: spring-boot dependency-injection inversion-of-control


    【解决方案1】:

    答案

    1. 接口层用于代码的抽象,当您想为其提供不同的实现时,它会非常有用。当您创建一个实例时,您只是创建一个 ApplicationUserServiceImpl 并将其分配给 ApplicationUserService 的引用变量,此概念称为向上转换。即使您已经创建了子类/实现类的对象,您也只能访问父类/接口类中定义的属性或方法。请参阅此以获取更多信息 https://stackoverflow.com/questions/62599259/purpose-of-service-interface-class-in-spring-boot#:~:text=There%20are%20various%20reasons%20why,you%20can%20create%20test%20stubs
    2. 在此示例中,当创建 applicationusercontroller 对象时。 spring 引擎(或 ioc 容器)将创建一个 ApplicationUserServiceImpl 对象(因为接口只有一个实现)并作为构造函数返回给控制器对象,您将其分配给 refrence 变量也参考称为 IOC 的概念(反转控制)
    3. 如上一个答案中所述,spring 将负责对象创建(对象生命周期),而不是您明确地执行它。它会使对象松散耦合。在这种情况下,创建实例的控制是使用 spring 。 这样做的非DI方式是 私有 ApplicationUserService applicationUserService = new ApplicationUserServiceImpl()

    希望我已经回答了你的问题

    【讨论】:

    • 如果我使用 new 关键字创建 ApplicationUserServiceImpl 的对象,它的工作方式与当前 DI 的工作方式相同,但在使用 new 关键字创建对象的情况下,我会被要求在任何地方都做同样的事情,但在我上面所做的代码中,我处理了 ApplicationUserServiceImpl 的所有对象创建。你能告诉我这是怎么发生的吗?我的意思是我知道 Spring 在这种情况下会负责创建对象,但是 Spring 是如何实现的呢?
    • 这个链接如何让你理解baeldung.com/…的概念
    • 我觉得你需要学习我们提供基于xml的bean配置的spring框架。在springboot中,ioc引擎通过默认项目的主包在提供的路径中搜索bean/componet/service类,并创建该类型的对象并将其传递给构造函数
    • 如果我解决了您的疑问,您能否给个赞
    【解决方案2】:

    这个类比可以让你更好地理解,考虑一个你有能力做饭的例子。根据 IoC 原理(原理是 DI 的基础),您可以反转控制,因此您可以直接从外面订购食物,而不是烹饪食物,您可以在家门口收到食物。因此,将食物送到您家门口的过程称为控制反转。 您不必自己做饭,而是可以订购食物并让送货主管为您送货。这样,您就不必承担额外的责任,而只需专注于主要工作。 现在,你知道了依赖注入背后的原理,让我带你了解依赖注入的类型

    【讨论】:

    • 类比我理解 IoC。我在网上看到的最好的例子是:当你结婚时……你失去了控制! :D 这很明显!在你结婚之前,你拥有所有的控制权。现在,当您离婚时,您已经颠倒了控制权,并且控制权又回来了! :D 好笑吧?这就是控制反转的意思吗?
    • 是的,这很有趣:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2017-06-21
    • 2018-01-19
    相关资源
    最近更新 更多