【问题标题】:Difference between Inversion of Control & Dependency Injection [duplicate]控制反转和依赖注入之间的区别
【发布时间】:2015-01-09 04:21:41
【问题描述】:

IoC 和 DI 概念让我非常困惑,所以我阅读了很多不同人的观点和帖子,最后得出了结论。所以据我了解,这些主题是...

控制反转是java中的一种技术,用于制作松散耦合且更易于维护的应用程序,而依赖注入是实现这一概念的一种方式(技术)。

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

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

【问题讨论】:

    标签: java spring oop design-patterns


    【解决方案1】:

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

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

    参考:Inversion of Control vs Dependency Injection

    【讨论】:

      【解决方案2】:

      控制反转 (IoC) 是指框架或运行时控制程序流的编程风格。控制反转意味着我们正在改变正常方式的控制。它适用于依赖倒置原则。

      DI 是一种软件设计模式,允许我们开发松散耦合的代码。 DI 是减少软件组件之间紧密耦合的好方法。 DI 还使我们能够更好地管理软件中的未来变化和其他复杂性。 DI 的目的是使代码可维护。

      【讨论】:

        【解决方案3】:

        这些是在java编程中实现松耦合的模式

        DI(依赖注入)
        依赖注入是一种用于创建对象实例的模式 其他对象在编译时不知道所依赖的 哪个类将用于提供该功能,或者只是将属性注入对象的方式称为依赖注入。

        我们有三种类型的依赖注入

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

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

        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 的更多信息:- 您可以在此处找到这些概念的优势和应用。

        What is dependency injection?

        【讨论】:

        • 我有一个疑问,如果有两个类具有 DependentClass 接口的定义,那么 IOC(DI) 捕获哪个定义?
        • 如果我理解正确,您是在询问一个类是否有 2 个依赖项,即根据我们的示例 DependentClass1 dependentObject1DependentClass2 dependentObject2 然后这两个类都由依赖注入器实例化
        • 不,我的意思是,如果DependentClass1 dependentObject1DependentClass2 dependentObject2 都实现了接口ABCInterface,那么当我在ABCInterface 上使用@Autowired 时,容器会采用谁的定义?
        • 这取决于依赖注入器是如何实现的......你使用的是哪个依赖注入器
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            控制反转和依赖注入是Spring框架的核心设计模式。 IOC 和 DI 设计模式也是 Java 中流行的设计模式面试题。顾名思义,控制模式反转反转管理对象生命周期的责任,例如创建一个对象,设置它们的依赖关系等从应用程序到一个框架,这使得编写 Java 应用程序更加容易。

            阅读更多:http://javarevisited.blogspot.com/2012/12/inversion-of-control-dependency-injection-design-pattern-spring-example-tutorial.html#ixzz4xve86pPN

            【讨论】:

              猜你喜欢
              • 2010-09-13
              • 2011-04-24
              • 2012-02-05
              • 2011-02-08
              • 1970-01-01
              • 2010-10-31
              • 1970-01-01
              • 2011-03-14
              相关资源
              最近更新 更多