前言

  1. 依赖倒置是面向对象开发中的基本设计原则。倡导上层模块不依赖于底层模块的具体实现(而依赖于抽象),抽象不依赖具体实现(而是具体实现依赖于抽象)。
  2. 控制反转是遵守依赖倒置这个原则而提出来的一种设计模式,它引入了 IoC 容器的概念。
  3. 依赖注入是为了实现控制反转的一种手段之一。
  4. 它们的本质是为了代码更加的“高内聚,低耦合”

一、DIP(依赖倒置)

  1. 把原本的上层建筑依赖底层的关系“倒置”过来,变成底层建筑依赖上层建筑。
  2. 上层建筑决定需要什么,底层就去实现这样的需求,但是高层并不用管底层是怎么实现的。

二、IoC(控制反转)

  1. 控制反转(Inversion of Control) 就是依赖倒置原则的一种代码设计的思路。
  2. 随着DI的频繁使用,经常实现IOC,会重复写很多相似的代码。在初始化的过程中就不可避免的会写大量的new,所以就有人就把这些实现IOC的代码打包成组件或框架,避免重复造轮子
  3. 实现IOC的组件或者框架,我们可以叫它IOC Container。
  4. 容器可以自动对你的代码进行初始化,你只需要维护一个Configuration(可以是xml可以是一段代码),而不用每次初始化都要亲手去写那一大段初始化的代码。
  5. IoC Container还有个好处,在创建实例的时候不需要了解其中的细节。因为一般使用IOC容器架构,都要求在写class的时候需要写相应的Config文件,所以要初始化很久以前的Service类的时候,前人早就已经写好了Config文件,你直接在需要用的地方注入这个Service就可以了。

三、DI(依赖注入)

  1. 依赖注入是控制反转的其中一种具体实现方式。
  2. 依赖注入有三种实现方式。

  • 构造函数注入,就是在构造函数加个参数,把依赖传递进去。
  • setter注入,就是写一个setXXXX的方法函数,在实例化之后再注入。
  • 接口注入,和setter有点类似。但采用的是接口的方式,继承接口然后实现接口,在接口实现的位置把依赖注入。

四、SL(服务定位器)

  1. 服务定位器应该能够在不知道抽象类的具体类型的情况下定位到服务。例如,它可能会使用字符串或服务接口类型来影射服务,这允许在无需修改类的条件下替换依赖项的具体实现。
  2. 在服务提供者中绑定接口及其实现,将服务实例注册到服务容器中,然后在使用时可以通过依赖注入或者通过服务接口/别名获取服务实例的方式调用服务。

五、总结

最后,来个流程图捋一下它们之间的传承关系。

参考资料

《小话设计模式原则之:依赖倒置原则DIP》
《依赖注入(DI)和 服务定位器(SL)的基本概念》
《知乎回答 Spring IoC有什么好处呢? – Sevenvidia的回答 – 知乎》





http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

技术经理,个人站长,创业者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据