依赖反转原则

控制反转(IOC)

Inversion Of Control,缩写为 IOC。(此处的 IOC 与 Spring 的 IOC 不是一回事)。

“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。

控制反转并不是一种具体的实现技巧,而是一个比较笼统的设计思想,一般用来指导框架层面的设计。

依赖注入(DI)

Dependency Injection,缩写为 DI。

一句话来概括就是:不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。

依赖注入框架(DI Framework)

什么是依赖注入框架呢?依赖注入框架应该提供扩展点,能够通过简单配置一下所有需要创建的类对象、类与类之间的依赖关系,就可以实现由框架来自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。

例如:Spring 框架。虽然 Spring 是控制反转容器,但控制反转容器这种表述是一种非常宽泛的描述,而 DI 依赖注入的表述更加具体、更有针对性。Spring 框架的控制反转主要就是通过依赖注入来实现的。

其他依赖注入框架还有 Google Guice 等

依赖反转原则(DIP)

Dependency Inversion Principle,缩写为 DIP。也成为依赖倒置原则。

英文描述:High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.

意思就是:高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。

所谓的高层模块和低层模块,简单来说就是,在调用链上,调用者属于高层,被调用者属于低层。在的业务代码开发中,高层模块依赖底层模块是没有任何问题的。实际上,这条原则主要还是用来指导框架层面的设计。

例如:Tomcat 是运行 Java Web 应用程序的容器。Web 应用程序代码只需要部署在Tomcat容器下,便可以被 Tomcat 容器调用执行。按照之前的划分原则,Tomcat 就是高层模块,Web 应用程序代码就是低层模块。Tomcat 和应用程序代码之间并没有直接的依赖关系,两者都依赖同一个“抽象”,也就是 Servlet 规范。Servlet 规范不依赖具体的 Tomcat 容器和应用程序的实现细节,而 Tomcat 容器和应用程序依赖 Servlet 规范。