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

依赖注入和依赖查找(DI和DL)
这两种方式看起来很像,但实际上差别是巨大的,从名字也能窥见一二。
什么是依赖?
依赖就如它这个词本身代表的意义,Java中的类关系的依赖也是如此,A类依赖B类,这说明在A类中有用到B类。再简单的说,可以理解成A类中有import B类,并且是有使用的。
由于A类用了B类的东西,所以一旦没有B类,A类必将报错,甚至编译都过不了,这就是依赖性。
依赖注入,正如其名,是由容器将类依赖的对象注入到类中,类只需要被动躺着等自己需要的对象到来就行了。
而依赖查找,则是类通过IoC容器主动查找自己所需的依赖,具有主动性。
一个是等人把饭喂到你嘴里,一个是让你自己上门找饭吃,差别是很大的。
实际上我们一般也是都是用依赖注入,而不是依赖查找。原因后面会说明,主要是因为耦合性。
这里我先讲解一下依赖查找,依赖注入作为压轴要重点学习。
1)依赖查找
顾名思义,是让类主动去查找自己所需的依赖,是比较传统的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,仍然产生了耦合。
②依赖注入可以做到的事
如果程序中只定义了接口变量,那么它使用的时候肯定会报空指针异常。我们先不关注依赖是如何注入的,总之我们将依赖通过某种方式方法,注入到了接口变量中,让它实际上有了它的某个实现类的对象,而不再是null。依赖它的程序在使用时,也会惊奇的发现并没有报空指针异常。
并且这个程序现在只依赖了接口,使用时当然也是以接口中定义的方法使用的。如果我们偷偷的将这个接口变量的实现类替换成另一个实现类,程序当然完全发现不了,一切照常运行,甚至连包都不需要重新打。
而Spring,目前就是IoC+DI最大的实现框架,并且,它的野心远不止于此。。

如若转载,请注明出处:https://www.yiheng8.com/50059.html