IoC控制反转基础入门


参考:https://www.tutorialsteacher.com/ioc

作者本人在学习Ioc时,始终不理解IoC的本质什么,很多中文资料在我看来比较难懂,于是搜索英文资料,终于找到一篇比较浅显易懂的文章。原文代码是C#写的,本人用Java重写。

1. 简介

你可能听说过以下几个名词:

中文 英文 英文缩写
控制反转 Inversion of Control IoC
依赖倒转原则 Dependency Inversion Principle DIP
依赖注入 Dependency Injection DI
IoC容器 Ioc Container

但是你可能不清楚他们之间的区别。
IoC控制反转基础入门
如上图所示,IoC和DIP是处于上层的设计原则(Principle),也正因为是原则,所以没有提供具体的实现细节,这些原则是我们设计类时需要遵循的原则。DI是模式(Pattern),Ioc容器是框架(Framework)。

让我们先简单过一下上面的几个概念。

  • 控制反转 IoC

IoC是一种设计原则,它建议在面向对象设计中反转(Inversion)各种控制(Control),以达到在类之间的松耦合(Loose Coupling)。在这里,控制更多指的是类的附加职责,而不是它的主要职责,比如控制应用的流程或控制所依赖类的创建和绑定。

  • 依赖倒转原则 DIP

DIP同样可以达到类之间的松耦合,强烈建议同时使用IoC和DIP来达到松耦合设计。

DIP建议高层模块(high-level modules)不应该依赖低层模块(low-levle modules),两者都应该依赖抽象(abstaction, )。在java中,抽象指的是抽象类或者接口。

  • 依赖注入 DI

DI是一种设计模式(Pattern),用来实现IoC,以达到反转依赖类的创建的目的。

  • IoC容器

IoC容器是一种框架,用来管理应用程序中的自动依赖注入,因此我们程序猿可以节省体力。著名的spring中就提供IoC容器ApplicationContext。

下图所示,我们一步一步地学习从耦合类到松耦合类的设计过程。
IoC控制反转基础入门
强耦合类 -> 使用工厂模式实现IoC -> 通过创建抽象实现DIP -> 实现DI -> 使用IoC容器 - > 松耦合类。

2. 控制反转 IoC