美文网首页
依赖注入(DI)和控制反转(Ioc)

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

作者: 御风逍遥 | 来源:发表于2018-07-06 11:09 被阅读13次

    1.依赖 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。例如下面类 Human 中用到一个 Father 对象,我们就说类 Human 对类 Father 有一个依赖。

    public class Human {
        ...
        Father father;
        ...
        public Human() {
            father = new Father();
        }
    }
    

    仔细看这段代码我们会发现存在一些问题:

    (1). 如果现在要改变 father 生成方式,如需要用new Father(String name)初始化 father,需要修改 Human 代码;

    (2). 如果想测试不同 Father 对象对 Human 的影响很困难,因为 father 的初始化被写死在了 Human 的构造函数中;

    (3). 如果new Father()过程非常缓慢,单测时我们希望用已经初始化好的 father 对象 Mock 掉这个过程也很困难。

    2.依赖注入 上面将依赖在构造函数中直接初始化是一种 Hard init 方式,弊端在于两个类不够独立,不方便测试。我们还有另外一种 Init 方式,如下:

    public class Human {
        ...
        Father father;
        ...
        public Human(Father father) {
            this.father = father;
        }
    }
    

    上面代码中,我们将 father 对象作为构造函数的一个参数传入。在调用 Human 的构造方法之前外部就已经初始化好了 Father 对象。

    像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。

    简单来说,a依赖b,但a不控制b的创建和销毁,仅使用b,那么b的控制权交给a之外处理,这叫控制反转(IOC),而a要依赖b,必然要使用b的instance,那么

    1. 通过a的接口,把b传入;
    2. 通过a的构造,把b传入;
    3. 通过设置a的属性,把b传入;

    这个过程叫依赖注入(DI)。

    现在我们发现上面 1 中存在的两个问题都很好解决了,简单的说依赖注入主要有两个好处:

    (1). 解耦,将依赖之间解耦。

    (2). 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。

    依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。

    常用的注入方式有三种,分别是:构造注入,设值注入(Setter注入)和接口注入

    构造注入是指通过构造函数来传入具体类的对象;设值注入是指通过Setter方法来传入具体类的对象;而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

    依赖注入三种方式

    控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。

    对象A获得依赖对象B的过程,由主动创建行为变为了被动注入行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。 其中依赖注入是控制反转最常用的实现,IoC框架使用依赖注入作为实现控制反转的方式 。

    • 控制反转是一种思想
    • 依赖注入是一种设计模式

    相关文章

      网友评论

          本文标题:依赖注入(DI)和控制反转(Ioc)

          本文链接:https://www.haomeiwen.com/subject/nudvuftx.html