IOC / DI / DIP 小记
- 题图为川西某个雨后朦胧的山
Survey
- 理解 IOC / DI / DIP 究竟是什么 ?
Question
- IOC ( Inversion Of Control ) 控制反转是什么?
- DI ( Dependency Injection ) 依赖注入是什么?
- 依赖注入框架(DI Framework)是什么 ? 为什么要有依赖注入框架 ?
- DIP ( Dependency Inversion Principle ) 依赖倒置(反转)原则是什么?
- 控制反转、依赖倒置、依赖注入,这三者有何区别和联系?
- 基于接口进行 依赖注入 有什么好处?
Read
IOC ( Inversion Of Control ) 是什么? 控制反转是什么?
控制反转是一个比较笼统的设计思想,并不是一种具体的实现方法,一般用来指导框架层面的设计
框架提供了一个可扩展的代码骨架,用来组装对象、管理整个执行流程。程序员利用框架进行开发的时候,只需要往预留的扩展点上,添加跟自己业务相关的代码,就可以利用框架来驱动整个程序流程的执行。
这里的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。
DI ( Dependency Injection ) 依赖注入是什么?
依赖注入和控制反转恰恰相反,它是一种具体的编码技巧。
不通过 new() 的方式在 类内部 创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。
依赖注入框架(DI Framework)是什么 ? 为什么要有依赖注入框架 ?
DI framework 具体的实现中有 Java 中的 Spring framework 等, 由 DI 框架来自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。
在实际的软件开发中,一些项目可能会涉及几十、上百、甚至几百个类,类对象的创建和依赖注入会变得非常复杂。如果这部分工作都是靠程序员自己写代码来完成,容易出错且开发成本也比较高。而对象创建和依赖注入的工作,本身跟具体的业务无关,我们完全可以抽象成框架来自动完成。而这个框架就是 依赖注入框架
DIP ( Dependency Inversion Principle ) 依赖倒置(反转)原则是什么?
依赖倒置原则通俗说就是,高层模块不依赖低层模块,而是都依赖抽象接口,这个抽象接口通常是由高层模块定义,低层模块实现。
- Don’t call me,I will call you.
- 依赖倒置强调:接口使用者定义接口,而不是接口实现者定义接口。
Tomcat 是运行 Java Web 应用程序的容器。我们编写的 Web 应用程序代码只需要部署在 Tomcat 容器下,便可以被 Tomcat 容器调用执行。按照之前的划分原则,Tomcat 就是高层模块,我们编写的 Web 应用程序代码就是低层模块。Tomcat 和应用程序代码之间并没有直接的依赖关系,两者都依赖同一个“抽象”,也就是 Servlet 规范。Servlet 规范不依赖具体的 Tomcat 容器和应用程序的实现细节,而 Tomcat 容器和应用程序依赖 Servlet 规范。
控制反转、依赖反转(倒置)、依赖注入,这三者有何区别和联系?
不看上面的内容, 请复述
基于接口进行 依赖注入 有什么好处?
- 联想到 开闭原则, 提高了可扩展性
Recite
Review
参考
- SOLID - 依赖反转
- https://time.geekbang.org/column/article/177444
- Don’t call me , I will call you 好莱坞原则
- 这里的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。
- spring 与 IOC
- 参考 spring-core 官方文档 https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core
- Foremost amongst these is the Spring Framework’s Inversion of Control (IoC) container.
- spring 框架中, 最重要的技术就是 IOC 容器
- 相对于细节的多变性,抽象的东西要稳定的多