对于Spring,从学校到现在算起来虽然将近使用了有两年,但对于“依赖注入”这一概念被猛然问起时,却不知做如何解释。幸运的是看到【spring框架,技术详解及使用指导.pdf】这本电子书上做的解释,感觉挺合理。这是文章中的原话
“从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。”
笔记本电脑、移动硬盘、U盘。“三中设备都有一个共同点,都支持USB接口。当我们需要将数据复制到外围存储设备时,可以根据情况,选择是保存在U盘还是USB硬盘。”
“笔记本电脑与外围存储设备通过预先指定的一个接口(USB)相连,对于笔记本而言,只是将用户指定的数据发送到USB接口,而这些数据何去何从,则由当前接入的USB设备决定。在USB设备加载之前,笔记本不可能预料用户将在USB接口上接入何种设备,只有USB设备接入之后,这种设备之间的依赖关系才开始形成。”
“对应上面关于依赖注入机制的描述,在运行时(系统开机,USB设备加载)由容器(运行在笔记本中的Windows操作系统)将依赖关系(笔记本依赖USB设备进行数据存取)注入到组件中(Windows文件访问组件)”
就如上面所说的那样,假使我们需要把移动硬盘(组件A)中的数据存放到U盘(组件B)中,我们会把移动硬盘(组件A)中的数据放入笔记本(容器),然后从笔记本(容器)中取数据,移动到U盘(组件B)中。这种依赖于容器来实现数据的存取的做法,我想就是依赖注入的浅层解释吧。
IoC还有另一个称呼,即Hollywood原则(“Don't call me,I'll call you”,即,请不要调用我,我将调用你)。通常,应用代码需要告知容器或框架,让它们找到自身所需要的类,然后再由应用代码创建待使用的对象实例。因此,应用代码在使用实例之前,需要创建对象实例。然而,IoC将创建对象实例的任务交给IoC容器或者框架(实现IoC设计模式的框架,有时候也称为IoC容器),使得应用代码只需要直接使用实例,这就是IoC.
通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,更利于测试,而且整个产品或系统更利于集成和配置。