了解依赖项注入

本文深入解析了依赖注入在Spring框架中的应用,通过实例阐述了如何通过多态性实现对象间的解耦,以及如何通过依赖注入机制在代码中灵活地管理对象依赖关系。
摘要由CSDN通过智能技术生成

了解依赖项注入

前言

你好,欢迎来到这个介绍Spring框架的笔记。
这篇以及接下来的笔记将涵盖Spring框架。我们将学习如何在我们的Java应用程序中使用Spring框架。那Spring框架到底是什么呢?

依赖注入及其优势

实际上,它是很多东西的集合。但Spring真正受欢迎的是它的依赖注入,我们将在这个领域学习依赖注入,这将为Spring提供一个良好的入门。随着我们进一步的教程,我们将了解Spring的一些其他功能以及Spring在我们的应用程序中执行的其他角色。那什么是依赖注入呢?有时也称为控制反转,定义是一种解耦对象之间传统依赖关系的方式。

假设你有两个相关联的对象,一个依赖于另一个。这个想法是解耦这种依赖关系,使它们不再相互耦合。我举个例子来解释一下这个概念的含义。现在假设我有一个绘图应用程序,我已经创建了画圆形和画正方形的代码,并且我正在使用该代码在屏幕上绘制某些图形。现在我有一个圆形对象,假设圆形对象有一个draw方法。我还有一个三角形对象,三角形对象也有一个draw方法。现在我可以使用这些对象来绘制屏幕上的圆形或三角形。在这里插入图片描述

那么,假设我有一个应用程序类。我可以在类中实例化圆形对象,并且我可以绘制一个圆。我可以立即实例化一个三角形对象,并在类中绘制一个三角形。所以,代码会像这样:我会说,Shape myShape,然后在这里实例化一个三角形,并调用该对象的draw方法。同样,我实例化了圆形对象,并在这里调用圆形对象的draw方法。在这里插入图片描述

现在,假设我不希望我的应用程序类专门与这些对象绑定在一起。我想要使用多态性。那么,在这里如何使用多态性?使用多态性的整个想法是拥有某种接口类和继承该父类的子类,并且在运行时,我为该父类提供不同的子类,然后子类的方法就会被执行。所以让我通过向你展示来澄清这一点。我会修改代码以实现更正式的方式。

假设我有一个Circle对象和一个Triangle对象,两者都有相似的draw方法。现在我将有一个Shape接口或Shape基类,它有一个draw方法,然后我将Circle和Triangle对象都继承自Shape接口或Shape基类。那么会发生什么?Circle对象将重写Shape的draw方法,而Triangle对象将重写Shape的draw方法。现在,Circle的draw方法将包含绘制圆的代码,而Triangle的draw方法将包含绘制三角形的代码。在这里插入图片描述

现在,如果我在我的应用程序类中使用多态性,我会这样写代码:而不是实例化一个Triangle对象,我会将Shape对象设置为Triangle。同样,我会将Shape设置为Circle。现在我要做的是调用Shape的draw方法。如果Shape是Triangle,它将调用这个draw方法。如果Shape是Circle对象,它将调用这个draw方法。所以这实际上是多态性在起作用。在这里插入图片描述

我们正在做一些使用多态性概念的事情。而不是调用对象本身的方法,我有一个指向Shape对象的句柄,并且我将调用父对象的draw方法。现在,这个父对象可以是一个抽象类,也可以是一个接口。整个想法是当我调用这个特定的Shape或draw时,我不知道我有什么对象。所以,这是多态性的简单实现。

实际上,这不是真正的多态性,因为看到我们在这里做的是我们仍然将代码绑定到三角形或圆上。我仍然在应用程序类中实例化Circle对象或Triangle对象,所以应用程序类总是知道它是一个三角形还是一个圆。所以使用Shape并没有什么好处。它仍然对三角形或圆进行了硬编码。所以我们要进一步思考这个问题。

接下来我们要做的是,我们不是硬编码,我将写一个方法,我将有一个叫做myDraw的方法。这将以Shape为参数。现在,这个Shape可以是任何东西,可以是圆形,也可以是三角形。这个方法不知道它是什么。所以这个方法所做的就是调用Shape的draw方法。现在,根据传递给myDraw方法的对象是什么,如果你传递一个圆,myDraw就会绘制一个圆,因为你调用了这个方法。如果你传递一个三角形,myDraw方法就不会绘制,因为它不会调用这个方法。但本质上,这个myDraw方法不用担心是什么形状。它只知道被传递为Shape的对象,并且它将绘制在这个对象中实现的任何draw方法,无论是圆还是三角形都不是这个方法的事情。它只是调用draw方法,根据传递的对象来绘制圆形或三角形。所以这很好。
在这里插入图片描述在这里插入图片描述
所以我要做的是将有一个绘图类,这个绘图类将有一个名为shape的类成员变量,它不会是一个成员变量,三角形它不是将成为Circle的成员变量,它将成为shape类型的成员变量。

假设我有这样的代码,我有一个绘图类,我有一个私有的形状对象,现在我要做的是定义一个setter在这里,它会告诉我,我将定义一个公共setter设置形状,我将采用一个形状对象,并将其设置为这个形状,现在它可以接受一个圆形,它可以接受一个三角形,明天可以接受一个五边形或者六边形,只要它会接受这个对象,无论传递什么形状对象,他都会将其设置在这个类中,它将把它设置为成员变量,然后我有一个绘制形状方法,它只是绘制,即使他只是调用形状的绘制方法(已设置的为准),请注意,这不会进行初始化,您在这里看不到新的形状,您看不到新的三角形或新的圆形,绘图类将假设有人正在实例化该对象,并将该对象提供给此类。在这里插入图片描述
现在将要发生的事情事,我们现在完全删除了对三角形或形状的依赖关系,如果您像绘制三角形,则不必修改绘图类,您需要做的就是将三角形传递给设置器(set),如果您将三角形传递给此设置器,您将绘制一个绘图点设置形状,然后执行我们的绘图点绘制形状,如果您传递一个,它将绘制一个三角形圆形对象到设置器,您说绘制形状当您传递圆形对象,然后您执行绘制点绘制的形状,它将绘制一个圆,所以将要发生的情况是在不同的类中,像下面图这样,您将有一个三角形,我的三角形等于新的三角形,我将实例化该三角形,然后我将有该绘图类的一个对象,我将做一个设定的形状,我将传递该三角形,现在它是一个三角形,它可以是任何形状。
在这里插入图片描述
没关系,然后我将做一个绘图绘制形状,然后绘图类,它不知道它有什么形状并且它并不真正关心它只是调用绘制形状的方法,并且它将调用您相应形状的绘制方法,三角形或圆形。

现在这里的优点是,在我们的绘图类中,将特定形状的实例作为三角形或圆形,而不是拥有特定形状的实例,它具有父类对象类的实例,所以这可以是任何东西,现在会发生的事情是我将有一个不同的类,它有一个三角形,然后这个类将把三角形传递给这个绘图类,然后绘图类将有一个三角形让这个类传递这个绘图类的 一个圆圈,这个绘图类将有一个圆圈,然后再次正如我所说,只要该对象是一个形状,它就可以实例化新对象,因此您可以绘制一个新形状,您可以创建一个新形状,只要它是一个形状,就有100条边的对象,您可以将该对象传递给这个绘图类,绘图类所做的就是调用绘制该形状,整个想法是您不必修改这个绘图类,只需要传递形状中相应的对象,然后绘图类就绘制它。

但现在我们可能会再次问这个问题,这将必须进行正确的修改,必须修改这个不同的类,您将需要设置一个圆来绘制一个圆,我们需要设置一个三角形来触发一个要绘制的三角形,所以当然,为了让程序改变整个想法,必须更改一些东西,即您将整个依赖项从绘图类并不真正知道它所依赖的类,它并不真正知道它正在绘制什么,这样做的好处是,如果它必须绘制的内容发生更改,则不必修改绘图类。

首先我真的不知道它只是绘制一个形状,因此您可以让绘图类绘制各种形状,甚至无需修改,甚至无需修改绘图类的一行代码,而发生这种情况的原因是绘图类到形状对象不属于绘图类,绘图类不拥有该关系,绘图类只具有一个形状,它不不拥有与它正在绘制的实际形状无关,它不拥有该圆,不想只是在形状上建立三角形,并且绘图类对三角形的依赖实际上是通过其他东西注入到绘图类的,它是由不同的类注入的,所以这就是依赖注入的原理,你可以注入绘图类或者三角形类的依赖项,您可以稍后将绘图类的依赖项注入到原型中,因此该依赖项不是在类中硬编码,它实际上是由类外部的实体注入,所以这就是依赖项的整个概念注入,这样使Spring编码变得非常容易的事情,实际上发生的情况是,我们说的这个不同的类,我们仍然需要在这个场景中编写,在这种情况下,我们需要编写这个不同的类来实例化一个新的类,三角形然后将依赖项注入到绘图类,即使这是由spring处理的,你只需告诉spring说这里有这个对象,现在将此依赖项注入到该对象,这样你就不必编写这个类,你只需调用绘制形状然后配置spring将写入依赖项注入到写入对象中,spring会负责这一点,所以这是依赖注入非常高级的概述。

我希望这些概念在接下来的笔记中很清楚使用spring来实际实现这个依赖注入,以及如果遇到任何问题我希望它会变得更加清晰。在这里插入图片描述

总结

总之,我详细解释了依赖注入的概念以及如何通过使用多态性来实现解耦。首先描述了依赖注入的目的是解耦对象之间的依赖关系,使它们不再相互耦合。然后,通过一个绘图应用程序的例子说明了这一概念。

接着,我又介绍了多态性的概念,并通过创建一个Shape接口或基类,让Circle和Triangle对象都继承自该接口或基类,实现了多态性。作者展示了如何在应用程序类中使用多态性,通过设置Shape对象为Circle或Triangle,然后调用Shape的draw方法,实现了对不同对象的统一调用。

最后,提出了进一步的思考,即通过编写一个方法,以Shape作为参数,实现了真正的依赖注入。这个方法不需要知道传递的对象是什么,只需要调用传递对象的draw方法,从而实现了对不同形状的绘制而不需要硬编码。

总的来说,通过具体的例子生动地解释了依赖注入和多态性的概念,并展示了它们如何在代码中实现解耦,这样的方式能更让我们理解依赖注入和多态性,更深的理解Spring框架。

  • 35
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值