依赖注入与控制反转的理解

控制反转与依赖注入

定义

控制反转(IoC/Inverse of Control): 调用者不再创建被调用者的实例,而是由spring框架实现(容器创建)所以称为控制反转。

依赖注入(DI/Dependency injection): 容器创建好实例后再注入到调用者称为依赖注入。

当某个角色(调用者)需要另外一个角色(被调用者)的协助时,在传统的程序设计过程中,通常由调用者创建被调用者的实例。如果创建被调用者实例的工作不再由调用者来完成,而是由外部容器完成,因此称为控制反转;创建调用者的工作通常由外部容器完成,然后注入到调用者,因此成为依赖注入。

图例表示过程

没有IoC/DI的时候,常规的A使用C类的示意图:

有了IoC/DI容器之后,A类不再主动创建C类了,如图:

而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向注入到A类中去,如图:

代码实例

定义一个接口

public abstract class Person{
    abstract void sayHello();
}

第一个实现类

public class Chinese extends Person{
    public void sayHello(){
        System.out.println("您好!");
    }
}

第二个实现类

public class American extends Person{
    public void sayHello(){
        System.out.println("Hello,nice to see you!");
    }
}

调用的类,与传统的类的区别:该类调用Person子类的方法,传统设计在本类中创建实例,而在此类中并没有创建实例。

public class User{
    Person p=null;
    public Person getPerson(){
        return p;
    }
    //提供给容器的注入方法是setter,容器通过setter将Person类的实例(Person子类的实例化对象)注入到User类中
    public void setPerson(Person p){
        this.p = p;
    }

    //调用Person子类重写的sayHello方法,这里的p并没有实例化
    public void function(){
        p.sayHello();
    }

}

外部‘容器’

public class Container{
    public static User getUser(){
        //实例化被调用的对象,也就是上图的C类
        Person p = new Chinese();
        User user = new User();
        //容器类Container通过setter向调用者User注入Person Chinese的实例
        user.setPerson(p);
        return user;
    }
}

测试类

public class Test{
    public static void main(String[] args){
        User user = Container.getUser();
        user.function(); //后台输入“您好!”
    }
}

总结

根据上述,可以看出,依赖注入和控制反转是对同一件事情的不同描述,从某个方面来讲,就是描述的角度不同。

  1. 依赖注入是从应用程序的角度在描述,可以把依赖注入描述地完整点:应用程序依赖容器创建并注入它所需要的外部资源。
  2. 控制反转是从容器的角度在描述,可以把控制反转描述地完整点:由容器反向地向应用程序注入应用程序所需要的外部资源。

参考资料:

控制反转与以来注入

控制反转(IoC)和依赖注入(DI)简介

时间: 2024-11-01 00:21:41

依赖注入与控制反转的理解的相关文章

依赖注入和控制反转的理解,写的太好了。

学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

那些总是会问到的面试题:Spring依赖注入和控制反转的理解

IoC是什么Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确"谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了",那我们来深入分析一下: 谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象:而

依赖注入和控制反转的理解

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的

谈谈php依赖注入和控制反转

要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI--Dependency Injection   依赖注入 IoC--Inversion of Control  控制反转 1.参与者都有谁? 答:一般有三方参与者,一个是某个对象:一个是IoC/DI的容器:另一个是某个对象的外部资源.又要名词解释一下,某个对象指的就是任意的.普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序:对象的外部资源指的就是对象需要的,但是是从对象外部获取的

Spring 的核心机制:依赖注入(控制反转)

一.说到依赖注入(控制反转),先要理解什么是依赖. Spring 把相互协作的关系称为依赖关系.假如 A 组件调用了 B 组件的方法,我们可称A 组件依赖于 B 组件. 二.什么是依赖注入. 在传统的程序设计过程中,通常由调用者来创建被调用者的实例. 在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转:创建被调用者实例的工作通常由Spring 容器来完成,然后注入给调用者,因此也称为依赖注入. 三.依赖注入的好处. 依赖注入让 Spring 的 Bean 以被指文件组织在

php之依赖注入和控制反转

  DI——Dependency Injection   依赖注入  IoC——Inversion of Control  控制反转  要想理解上面两个概念,就必须搞清楚如下的问题: 1.参与者都有谁? 答:一般有三方参与者,一个是某个对象:一个是IoC/DI的容器:另一个是某个对象的外部资源.又要名词解释一下,某个对象指的就是任意的.普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序:对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源

反射机制、依赖注入、控制反转

反射机制 正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之. 反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法. 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码. 反射是.Net中获取 运行时类型信息的方式,.Ne

(转)依赖注入和控制反转

发现一篇介绍依赖注入和控制反转的文章,特转载以备后用. 文章地址1:http://baitai.iteye.com/blog/792980 相关文章:http://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html: http://www.cnblogs.com/xingyukun/archive/2007/10/20/931331.html: http://www.cnblogs.com/zhenyulu/articles/6417

PHP 依赖注入和控制反转再谈(二)

今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我个人的原则总是先简单瞟一眼概念,通过实例来对概念加深理解了) 要想理解 PHP 依赖注入 和 控制反转 两个概念,我们还是必须搞清楚下面的两个问题: DI -- Dependency Injection 依赖注入 IoC -- Inversion of Control 控制反转 什么是依赖注入 没有