抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

在学习Spring框架的过程中遇到了 Ioc(Inversion of Control)以及 DI(Dependency Injection)这两个概念,在查询网上的博客之后有了一些理解,此文作为记录。

特别感谢 Martin Fowler 发表的 Inversion of Control Containers and the Dependency Injection pattern 一文,对我的理解有极大的帮助!

IoC(控制反转)

为什么?

在面向对象设计的软件系统中,对象之间充满了合作关系,系统的工作需要各个合作的对象来完成,这很像齿轮组中齿轮之间的啮合关系,每个齿轮都正常转动才能够保证齿轮组的正常运转。但是如果整个软件系统过于庞大,对象之间的依赖关系必然会变得复杂,此时如果某个对象出了问题,那么维护这个对象的成本就与其所关联的对象规模成正比。

由于对象的耦合在面向对象设计中是无法避免的,而为了解决这个问题,IoC 应运而生。

是什么?

控制反转(IoC,Inversion of Control)是一种设计原则,用于减少代码的耦合性,提升模块化和可测试性。其核心思想是将程序的控制权从业务逻辑代码转移给框架或容器,由它们来管理对象的创建和依赖注入。

相当于将对象之间的依赖关系从彼此耦合到 IoC 容器(第三方)来解决各个对象之间的需求。

为什么叫控制反转?

Martin Fowler 认为 IoC 指的是将“获得依赖的过程进行反转”。控制被反转实际上指的是获取依赖对象的过程由对象自身管理变为交给 IoC 容器主动注入。他给「控制反转」起了一个更为精确的名字「依赖注入」。

DI(依赖注入)

是什么?

依赖注入是指由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

依赖注入(DI)和控制反转(IoC)就是从不同角度来描述同一件事,指通过IoC容器,利用依赖关系注入的方式实现对象之间的解耦合。

依赖注入是一种编程技巧,而控制反转是一种设计思想。

后记

  1. 控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。
  2. 依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。
  3. 通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以。

评论