面试官:依赖注入是啥?你懂吗

IOC DI 这究竟是个啥

hi 各位小伙伴,今天跟你们聊聊控制反转和依赖注入究竟是个啥?html

在了解过程当中看了不少的资料 若是有不正确的但愿你们跟我联系,一块儿学习java

本次文章分为如下三个部分web

  • IOC 和DI 是什么
  • IOC 和DI带来的好处
  • java中如何使用IOC和DI

IOC 和DI 是什么

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,能够用来减低计算机代码之间的耦合度。其中最多见的方式叫作依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。经过控制反转,对象在被建立的时候,由一个调控系统内全部对象的外界实体,将其所依赖的对象的引用传递(注入)给它。spring

控制反转到底反转的是什么,控制的又是什么,依赖注入 注入的是什么,依赖的又是什么?编程

首先让咱们忘记控制反转来看依赖注入,由于04年的时候马丁大叔就控制反转这个词语提出一种更加易懂的解释叫依赖注入,了解依赖注入才能更好理解控制反转。下面经过一个例子来引出依赖注入。函数

每一个文本输入框有一个文本检查器,每次初始化一个文本选择框都须要一个检查器。学习

public class TextInput {
    private  SpellCheck spellCheck;
    public TextInput() {
        spellCheck=new SpellCheck();
    }
}
复制代码
public class TextInput {
    private  SpellCheck spellCheck;
    public TextInput(SpellCheck spellCheck) {
        this.spellCheck=spellCheck;
    }
}
复制代码

观察以上两段不一样的代码咱们能够发现他们本质的区别是 SpellCheck对象建立的时间以及地点不一样,在后面代码中文本检查器做为一个文本框的构造方法中的一个形参传入文本框内部。便可以了解为将spellCheck对象注入TextInput类。经过这个例子大概就能够了解上面提出的问题,什么是依赖,什么是注入了吧,文本框依赖 检查器 ,将依赖的类做为 形参放入依赖的类中 就成为依赖注入。测试

接下来就是控制反转了,写过java web的同窗必定使用过一个注解@Autowired ,经过这个注解就能够直接生成一个类对象,而不须要显式 new一个出来。当咱们能够控制一个对象什么时候生成时这即是控制,而经过IOC容器将对象的建立权夺走,这即是权力反转。this

理解了上面的概念,其实你就知道控制反转是依赖注入的web应用,专门使用一个容器对要注入的类进行管理。方方便了用户在类外重复建立依赖类。因此深刻了解依赖注入是重点,而控制反转是DI的应用。如Martin 说的“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的得到被反转了,spa

下面让咱们来聊聊依赖注入到底有什么好处,以及依赖注入的几种方法。

在让咱们经过代码来了解他的好处

public class Car {
    private enginer enginer;
    private wheel wheel;

    public Car() {
        enginer = new enginer();
        wheel = new wheel();
    }
}
复制代码
public class Car {
    private enginer enginer;
    private wheel wheel;

    public Car(enginer enginer, wheel wheel) {
        this.enginer = enginer;
        this.wheel = wheel;
    }
}
复制代码

汽车是一个复杂对象,其中包括许多的组件,发动机,轮子等等, 各类各样的汽车老是大同小异,轮子的尺寸,当咱们想要建立两辆不一样的车的时候,但他们只有轮子的大小不一样时 方案1 要建立一个新car类在构造函数中新new 一个wheel对象,而方案二,只须要在外面建立 wheel对象传入car类就能够。减小了新建Car类 。也就是说减小了类之间的耦合,对象在运行时而不是在编译时(汽车制造时)被赋予它们的依赖关系。 因此咱们如今能够随时改变车轮。 在这里,依赖(车轮)能够注入到汽车在运行时间。同时这是一种很是有用的测试技术,由于它容许对依赖关系进行模拟或删除。

经过上面你们应该了解依赖注入了除了经过构造函数还有哪几种方式来实现依赖注入呢?

依赖注入有以下实现方式:

  • 基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
  • 基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
  • 基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
  • 基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不须要显式的定义以上三种代码,即可以让外部容器传入对应的对象。该方案至关于定义了public的set方法,可是由于没有真正的set方法,从而不会为了实现依赖注入致使暴露了不应暴露的接口(由于set方法只想让容器访问来注入而并不但愿其余依赖此类的对象访问)。

ok。ioc和di就介绍到这。若是上面有错误 请你们及时联系我并提出,不胜感谢。

参考文献

Effective java 第三版

wiki

what is dependency injection

What is Inversion of Control?

DI提出者原文

spring ioc di理解

相关文章
相关标签/搜索