依赖注入和容器

2018-07-22  本文已影响14人  Albert_Sun

Spring提倡面向接口编程,来降低模块耦合度,使代码易维护、重构和测试。其核心技术是依赖注入和面向切面编程,然后基于这两种核心技术实现了许多强大的功能。这里对依赖注入做一个理论上的梳理。

1、基本原则--依赖倒置原则(Dependence Inversion Principle, DIP)
DIP是一种软件设计的指导思想。传统软件设计中,上层代码依赖于下层代码,当下层出现变动时, 上层代码也要相应变化,维护成本较高。而DIP的核心思想是上层定义接口,下层实现这个接口, 从而使得下层依赖于上层,降低耦合度,提高整个系统的弹性。这种面向接口编程的思想,经实践证明是有效的策略。DIP只是一种理念、思想,而IoC是一种实现DIP的方法。

2、控制反转(Inversion of Control, IoC)
上层模块只定义了接口,下层模块只负责实现接口,上层模块不知道是哪个类实现了这个接口,甚至上层模块中不应该知道是哪个类实现了接口,因为当代码重构或修改后,类名发生了变化,仍旧需要修改上层代码。所以在上层模块中不应该负责对其依赖的实例化,这个实例化的过程就需要交给第三方来实现,也就是说不再负责其依赖的创建和生命周期,将其依赖对象的控制权交给第三方。 IoC的核心是将类(上层)所依赖的单元(下层)的实例化过程交由第三方来实现。 一个简单的特征就是类中不对所依赖的单元有诸如 new Class() 的实例化语句。

3、控制反转容器(IoC Container)
当项目比较大时,依赖关系可能会很复杂。 而IoC Container(即外部的第三方)提供了动态地创建、注入依赖单元,映射依赖关系等功能,减少了许多代码量。许多成熟的框架都实现了Container 来处理这些工作。

4、依赖注入(Dependence Injection, DI)
DI是IoC的一种设计模式,是一种套路,按照DI的套路,就可以实现IoC,就能符合DIP原则。 DI的核心是把类所依赖的单元的实例化过程,由第三方实现,而在上层模块创建时,第三方会自动将其依赖的单元实例化并通过某种方式注入到类的内部来。上层模块根本不知道注入的到底是哪个实体类,也不关心注入的过程,极大地降低了上层模块和其依赖的耦合度。

5、服务定位器(Service Locator)
Service Locator是IoC的另一种实现方式, 其核心是把所有可能用到的依赖单元交由Service Locator进行实例化和创建、配置, 把类对依赖单元的依赖,转换成类对Service Locator的依赖。 DI 与 Service Locator并不冲突,两者可以结合使用。 目前,Yii2.0把这DI和Service Locator这两个东西结合起来使用,或者说通过DI容器,实现了Service Locator。而Spring把DI使用到了极致。

上一篇下一篇

猜你喜欢

热点阅读