苹果|Spring零基础入门之什么是依赖注入(DI)和依赖查找(DL)

苹果|Spring零基础入门之什么是依赖注入(DI)和依赖查找(DL)

Spring零基础入门之什么是依赖注入(DI)和依赖查找(DL)
依赖注入和依赖查找(DI和DL)这两种方式看起来很像 , 但实际上差别是巨大的 , 从名字也能窥见一二 。


什么是依赖?
依赖就如它这个词本身代表的意义 , Java中的类关系的依赖也是如此 , A类依赖B类 , 这说明在A类中有用到B类 。 再简单的说 , 可以理解成A类中有import B类 , 并且是有使用的 。
由于A类用了B类的东西 , 所以一旦没有B类 , A类必将报错 , 甚至编译都过不了 , 这就是依赖性 。
依赖注入 , 正如其名 , 是由容器将类依赖的对象注入到类中 , 类只需要被动躺着等自己需要的对象到来就行了 。
而依赖查找 , 则是类通过IoC容器主动查找自己所需的依赖 , 具有主动性 。
一个是等人把饭喂到你嘴里 , 一个是让你自己上门找饭吃 , 差别是很大的 。
实际上我们一般也是都是用依赖注入 , 而不是依赖查找 。 原因后面会说明 , 主要是因为耦合性 。
这里我先讲解一下依赖查找 , 依赖注入作为压轴要重点学习 。
1)依赖查找【苹果|Spring零基础入门之什么是依赖注入(DI)和依赖查找(DL)】顾名思义 , 是让类主动去查找自己所需的依赖 , 是比较传统的IoC方法(最经典的实现是EJB) 。 现在这种方式用起来比较少 , 因为一旦你这么做了 , 你就和容器产生了依赖 。 一旦IoC容器被换掉、撤掉 , 那你这段代码自然就失效了 。
并且在IoC中 , 依赖查找还有两种不同的查找方式 , 分别是依赖拖拽(Dependency Pull , 简称DP)和上下文依赖查找(Contextualized Dependency Lookup , 简称CDL) 。
依赖拖拽主要是通过集中注册表查找的 , 通常 , 上下文依赖查找则是通过容器查找 。 关于这块内容 , 网上的资料并不多 , 唯一的线索就是EJB了 , 貌似EJB的核心就是依赖拖拽 。
我们现在如果不会EJB , 也只能先记住这几个关键词而已了 , 不用太急着探究 , 因为当前的重点是后面的依赖注入 。
2)依赖注入目前依赖注入是绝对的主流 , 比起依赖查找 , 它的优势是绝对性的 。
IoC本身能有资格被称之为一种设计思想 , 就必须有它的优势 , 不仅仅是搞出个容器管理对象就可以的 。 如果是依赖查找的方式 , 虽然项目中的类相互之间的耦合度降低了 , 但是仍然严重依赖了IoC容器 , 一旦替换或撤出 , 几乎就瘫痪了 。 而依赖注入就是一种不依赖容器的方式 , 将类所需的对象 , 主动的注入给它使用 。 甚至有时候 , 依赖注入DI和IoC的概念都不甚清楚 , 有时候DI比IoC更能表达它的思想 , 所以毋庸置疑 , IoC目前最核心的实现方式应该是依赖注入(DI) 。
上面说的有点抽象 , 不过没关系 , 我们再简单的讲解一下 。
①为什么可以松耦合?虽然前面没有提到 , 但其实IoC是基于面向接口编程的 , 通常我们需要对要实现的功能抽象出一个接口 , 具体功能方法则在实现类中 。 然后在需要使用它的类中 , 通过接口使用它 。 这样我们就可以通过更换接口的具体实现类 , 灵活的修改程序逻辑 。 因为程序依赖的是接口 , 而并非具体的实现类 , 所以程序相互之间的耦合性就大大降低了 。
再加上依赖注入 , 我们可以在程序的运行过程中 , 动态的决定程序中的依赖关系 , 也就是想用哪个实现类就用哪个实现类 。 而依赖查找虽然也可以通过修改配置文件达到这点 , 但是会导致程序依赖了IoC容器提供的方法和API , 仍然产生了耦合 。