什么是Spring框架中的依赖注入和控制反转?
什么是Spring框架中的依赖注入和控制反转?
“依赖注入”和“控制反转”常常作为使用Spring框架开发Web框架的主要优势被提及。
能否有人简单地解释一下这是什么,如果可能的话,附带一个例子?
我将写下我的简单理解这两个术语:(为了快速理解,只需阅读示例)
-
依赖注入(DI):
依赖注入通常意味着将依赖对象作为参数传递给方法,而不是让方法创建依赖对象。
在实践中,这意味着该方法不直接依赖于特定的实现;满足要求的任何实现都可以作为参数传递。使用此对象实现定义其依赖关系。Spring将其提供。
这导致开发松散耦合的应用程序。快速示例:创建EMPLOYEE OBJECT时,它将自动创建ADDRESS OBJECT(如果地址被Employee对象定义为依赖项)*。
-
控制反转(IoC)容器:
这是框架的常见特征,IoC管理Java对象
- 从实例化到销毁通过其BeanFactory。
- IoC容器实例化的Java组件称为bean,并管理bean的范围、生命周期事件和它被配置和编码的任何AOP特性。控制反转是关于获得自由、更灵活和更少依赖的原则。当您使用桌面计算机时,您是被奴役的(或者说是被控制的)。您必须坐在屏幕前并观看它。使用键盘键入和使用鼠标导航。一款糟糕的软件可以让您更加受制。如果用笔记本电脑替换桌面电脑,则可以反转某些控制。您可以轻松地拿起它并四处移动。因此,您现在可以控制使用计算机的位置,而不是计算机控制使用它
。通过实现控制反转,软件/对象消费者获得了对软件/对象的更多控制/选项,而不是被控制或拥有更少的选项。
控制反转作为设计准则具有以下目的:
- 执行某个任务与实现相分离。
- 每个模块可以专注于其设计的内容。
- 模块不做出关于其他系统的假设,而依赖于它们的契约。
- 替换模块对其他模块没有副作用。
我会在这里保持抽象,您可以访问以下链接以详细了解该主题。
- Spring通过依赖注入有助于创建松耦合的应用程序。
- 在Spring中,对象定义它们的关联(依赖项),并不关心如何获取这些依赖项。Spring是提供创建对象所需依赖项的责任。
例如:假设我们有一个名为Employee
的对象,它依赖于对象Address
。我们会定义一个对应于Employee
的bean,该bean将定义其对对象Address
的依赖。
当Spring尝试创建Employee
对象时,它会看到Employee
依赖于Address
,因此它将首先创建Address
对象(依赖对象),然后将其注入到Employee
对象中。
-
控制反转(IoC)和依赖注入(DI)可互换使用。IoC通过DI实现。DI是提供依赖项的过程,IoC是DI的结果。(注意: DI并不是实现IoC的唯一方法。还有其他方式。)
-
通过DI,创建对象的责任从我们的应用程序代码转移到Spring容器;这种现象被称为IoC。
- 可以通过setter注入或构造函数注入进行依赖注入。