控制反转和依赖注入的区别

28

IoC和DI的概念曾经让我非常困惑,所以我阅读了很多不同人的观点和文章,最终得出了结论。因此,据我理解,这些主题是...

控制反转是Java中一种用于创建松耦合且更易于维护应用程序的技术,而依赖注入则是实现该概念(技术)的一种方式之一。

控制反转容器在运行时从Java类中注入依赖项,以创建松散耦合的应用程序。

这是正确的吗?如果我错了,请纠正我...

6个回答

24

以下是实现Java编程中松耦合的模式

依赖注入(Dependency Injection,DI):
依赖注入是一种模式,用于创建对象的实例,让其他对象能够在不知道在编译时将使用哪个类来提供功能或简单地注入属性到对象的方式。我们有三种类型的依赖注入:

  1. 构造函数注入
  2. Setter / Getter注入
  3. 接口注入

Spring仅支持构造函数注入和Setter/Getter注入。

控制反转(Inversion Of Control,IOC):
将控制权交给容器来创建和注入应用程序所依赖的对象实例,即不再使用 new 操作符创建对象,而是让容器代为创建。控制反转依赖于依赖注入,因为需要一种机制来激活提供特定功能的组件。

这两个概念一起工作,可以编写更加灵活、可重用和封装的代码。因此,它们是设计面向对象解决方案的重要概念。

依赖注入示例

以前我们会这样写代码:

Public MyClass{
 DependentClass dependentObject
 /*
  At somewhere in our code we need to instantiate 
  the object with new operator  inorder to use it or perform some method.
  */ 
  dependentObject= new DependentClass();
  dependentObject.someMethod();
}

使用依赖注入,依赖注入器将为我们去掉实例化。

Public MyClass{
 /* Dependency injector will instantiate object*/
 DependentClass dependentObject

 /*
  At somewhere in our code we perform some method. 
  The process of  instantiation will be handled by the dependency injector
 */ 

  dependentObject.someMethod();
}

将控制权交给其他对象(例如容器)进行实例化和注入的过程可以称为控制反转

您可以在我的答案中阅读有关依赖注入和IOC的更多信息:- 您可以在此处找到这些概念的优势和应用。

什么是依赖注入?


如果有两个类都有DependentClass接口的定义,那么IOC(DI)会选择哪一个定义? - ankit
如果我理解正确的话,您是在询问一个类是否有2个依赖项,例如我们的示例中的DependentClass1 dependentObject1DependentClass2 dependentObject2,那么这两个类都是由依赖注入器实例化的。 - SAMUEL
不,我的意思是如果DependentClass1 dependentObject1DependentClass2 dependentObject2都实现了接口ABCInterface,那么当我在ABCInterface上使用@Autowired时,容器会采用谁的定义? - ankit
这取决于依赖注入器的实现方式... 你使用的是哪个依赖注入器? - SAMUEL

23

IoC是一个通用术语,它指的是框架调用由应用程序提供的实现,而不是应用程序调用框架中的方法。

DI是IoC的一种形式,通过构造函数/设置器/服务查找将实现传递到对象中,对象将“依赖”这些实现以正确地运行。

参考:Inversion of Control vs Dependency Injection


1
IOC代表“控制反转”。它基于IOC原则工作,这意味着协作对象并管理对象的生命周期。协作意味着将对象组合在一起。我们可以通过两种方式来协作对象,它们是依赖拉取和依赖注入。DP分为两种方式(依赖拉取和上下文依赖拉取),DI也分为两种方式(Setter注入和构造函数注入)。IOC支持这两种方式,但Spring框架的主要目的是使我们的组件完全松散耦合。如果我们使用依赖拉取,即使作为Spring框架的一部分,我们的组件类也会与另一个类紧密耦合,因此推荐使用依赖注入(Setter注入或构造函数注入)。IOC和DI没有区别。IOC和DI不同,DI是IOC的一部分。

1
控制反转意味着程序将控制委托给其他人来驱动流程。IOC(控制反转)是一个通用的父术语,而DI(依赖注入)是IOC的子集。IOC是一种概念,其中应用程序的流程被反转。不属于该实体的逻辑控制由其他人接管。DI提供对象所需的对象。因此,它们被注入而不是构建它们的依赖关系。通过上述方法实现的最大好处是“解耦”,我们可以调用对象并传递任何对象,使对象独立,提高可重用性和维护性。

0
控制反转(IoC)是一种编程风格,其中框架或运行时控制程序流。控制反转意味着我们正在改变正常方式的控制。它基于依赖反转原则。
DI是一种软件设计模式,允许我们开发松散耦合的代码。DI是减少软件组件之间紧密耦合的好方法。DI还使我们能够更好地管理未来的变化和其他复杂性。DI的目的是使代码可维护。

0
控制反转(Inversion of Control)和依赖注入(Dependency Injection)是Spring框架的核心设计模式。IOC和DI设计模式也是Java面试中常见的问题之一。正如其名称所示,控制反转模式将对象的生命周期管理责任从应用程序转移到框架中,例如创建对象、设置它们的依赖关系等,这使得编写Java应用程序变得更加容易。
阅读更多:http://javarevisited.blogspot.com/2012/12/inversion-of-control-dependency-injection-design-pattern-spring-example-tutorial.html#ixzz4xve86pPN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接