java高级培训-spring框架中ioc(反转控制)的理解

2020年10月23日 21:10

97

    学习过java相关知识的人一定已经听说过Spring的IoC(控制反转)的概念。对于那些刚接触Spring的人来说,IoC的概念总是含糊且难以理解。今天与您共享在Internet上,一些技术专家了解Spring框架的IOC,并谈论我对SpringIoc的理解。


    IoC是什么


    Ioc-控制反转或“控制反转”不是技术,而是设计思想。在Java开发中,Ioc意味着将您设计的对象交给容器来控制,而不是在对象内部进行传统的直接控制。如何理解Ioc?理解Ioc的关键是明确“谁控制谁,什么被控制,为什么是逆转(如果有逆转,就应该向前旋转)以及哪些方面逆转”,那么我们来分析一下深度:


    ●谁控制谁来控制什么:在传统的JavaSE编程中,我们直接通过new在对象内部创建对象,并且程序主动创建相关对象;并且IoC有一个特殊的容器来创建这些对象,即Ioc容器控制对象的创建;谁控制谁?当然,IoC容器控制对象。它控制什么?即,它主要控制外部资源的获取(不仅仅是对象,包括文件等)。


    ●为什么要逆转,什么方面要逆转:如果逆转,则将向前旋转。传统的应用是由我们自己主动控制在对象中,以直接获得从属对象,即正向旋转。而反转是由容器引起的,以帮助创建和注入相关对象;为什么要逆转?因为容器可以帮助我们查找和注入依赖对象,所以对象仅被动地接受依赖对象,因此它们是反向的。哪些方面是相反的?依赖对象的获取相反。


    用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:


   java高级培训


    当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:


java高级培训


    IoC能做什么


    IoC并不是一种技术,而是一种思想,一种重要的面向对象的编程法则,可以指导我们如何设计松耦合和更好的程序。在传统应用程序中,我们在类中积极创建依赖对象,这导致类之间的高度耦合且难以测试。使用IoC容器,可以将创建和查找依赖对象的控制交给该容器。注入复合对象,因此对象和对象之间是松散耦合的,这也便于测试,有利于功能重用,更重要的是,使程序的整个系统结构非常灵活。


    其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。


    IoC很好的体现了面向对象设计法则之一——好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。


    IoC和DI


    DI—DependencyInjection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。


    理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:


    ●谁依赖于谁:当然是应用程序依赖于IoC容器;


    ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;


    ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;


    ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。


    IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物MartinFowler又给出了一个新的名字:“依赖注入”,相对IoC而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。


    看过很多对Spring的Ioc理解的文章,好多人对Ioc和DI的解释都晦涩难懂,反正就是一种说不清,道不明的感觉,读完之后依然是一头雾水,感觉就是开涛这位技术牛人写得特别通俗易懂,他清楚地解释了IoC(控制反转)和DI(依赖注入)中的每一个字,读完之后给人一种豁然开朗的感觉。我相信对于初学Spring框架的人对Ioc的理解应该是有很大帮助的。


    相关推荐:java高级培训-Java阿姆达尔定律



更多鲁班学院java高级培训免费课程试听地址https://www.lubanjava.com/course.html

鲁班学院java高级培训课程https://www.lubanjava.com/course/detail/519.html

加群即可领取鲁班学院最新Java高级培训课程资料学习包 群号:700541970



在线咨询
免费试听
领取优惠
加群交流

扫一扫
加群领取架构师资料

售后反馈
返回顶部