谈谈对Spring IOC的理解

  • 时间:
  • 浏览:1

学习过Spring框架的人一定总要听过Spring的IoC(控制反转) 、DI(依赖注入)这有一另一个概念,对于初学Spring的人来说,总确实IoC 、DI这有一另一个概念是模糊不清的,是如此理解的,今天和大伙分享网上的许多技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。



  IoC的有一另一个重点是在系统运行中,动态的向某个对象提供它所还要的许多对象。许多点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A还要操作数据库,之后大伙时不时要在A中此人 编写代码来获得有一另一个Connection对象,有了 spring大伙就只还要告诉spring,A中还要有一另一个Connection,至于许多Connection为啥构造,几时构造,A不还要知道。在系统运行时,spring会在适当的之后制造有一另一个Connection,因此像打针一样,注射到A当中,原来就完成了对各个对象之间关系的控制。A还要依赖 Connection才能正常运行,而许多Connection是由spring注入到A中的,依赖注入的名字就如此来的。如此DI是怎么都能不能实现的呢? Java 1.3之后有一另一个重要内部结构是反射(reflection),它允许线程池池在运行的之后动态的生成对象、执行对象的最好的妙招、改变对象的属性,spring因此通过反射来实现注入的。

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

  理解DI的关键是:“谁依赖谁,为那先 还要依赖,谁注入谁,注入了那先 ”,原来们来深入分析一下:

  ●为那先 还要依赖:线程池池还要IoC容器来提供对象还要的内部内部结构资源



  在平时的java应用开发中,大伙要实现某有一另一个功能机会说是完成某个业务逻辑时为宜还要有一另一个或以上的对象来战略媒体合作完成,在如此使用Spring的之后,每个对象在还要使用他的战略媒体合作对象时,此人 均要使用像new object() 原来的语法来将战略媒体合作对象创建出来,许多战略媒体合作对象是由此人 主动创建出来的,创建战略媒体合作对象的主动权在此人 手上,此人 还要哪个战略媒体合作对象,就主动去创建,创建战略媒体合作对象的主动权和创建时机是由此人 把控的,而原来就会使得对象间的耦合度高了,A对象还要使用战略媒体合作对象B来同時 完成一件事,A要使用B,如此A就对B产生了依赖,也因此A和B之间存在有本身耦合关系,因此是紧密耦合在同時 ,而使用了Spring之后就不一样了,创建战略媒体合作对象B的工作是由Spring来做的,Spring创建好B对象,因此存储到有一另一个容器顶端,当A对象还要使用B对象时,Spring就从存放对象的那个容器顶端取出A要使用的那个B对象,因此交给A对象使用,至于Spring是怎么都能不能创建那个对象,以及那先 之后创建好对象的,A对象不还要关心那先 细节问提(你是那先 之后生的,为啥生出来的我可不关心,能我想干活就行),A得到Spring给大伙的对象之后,有2此人 同時 战略媒体合作完成要完成的工作即可。

图1-2有IoC/DI容器后线程池池内部结构示意图

  Ioc—Inversion of Control,即“控制反转”,总要 那先 技术,因此有本身设计思想。在Java开发中,Ioc因为将你设计好的对象交给容器控制,而总要 传统的在你的对象内部内部结构直接控制。怎么都能不能理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制那先 ,为啥是反转(有反转就应该有正转了),那先 方面反转了”,原来们来深入分析一下:

  IoC 总要 有本身技术,因此有本身思想,有一另一个重要的面向对象编程的法则,它能指导大伙怎么都能不能设计出松耦合、更优良的线程池池。传统线程池池总要 由大伙在类内部内部结构主动创建依赖对象,从而因为类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,全都对象与对象之间是 松散耦合,原来也方便测试,能助 功能复用,更重要的是使得线程池池的整个体系内部结构变得非常灵活。

  这是我对Spring的IoC(控制反转)的理解。DI(依赖注入)确实因此IOC的另外有本身说法,DI是由Martin Fowler 在1504年初的一篇论文中首次提出的。他总结:控制的那先 被反转了?因此:获得依赖对象的最好的妙招反转了。

  理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作因此在spring的框架中堆积木而已。

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

  IoC和DI由那先 关系呢?确实它们是同有一另一个概念的不同层厚描述,机会控制反转概念比较含糊(机会因此理解为容器控制对象这有一另一个层面,如此让他想到谁来维护对象关系),全都1504年大师级人物Martin Fowler又给出了有一另一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

  确实IoC对编程带来的最大改变总要 从代码上,因此从思想上,存在了“主从换位”的变化。线程池池原来是老大,要获取那先 资源总要 主动出击,因此在IoC/DI思想中,线程池池就变成被动的了,被动的等待IoC容器来创建并注入它所还要的资源了。

图1-1 传统线程池池示意图

  首先想一段话IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,因此由spring来负责控制对象的生命周期和对象间的关系。这是那先 意思呢,举个简单的例子,大伙是怎么都能不能找女大伙的?常见的情况是,大伙到处去看哪里有长得漂亮身材又好的mm,因此打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想最好的妙招认识她们,投其所好送其所要,因此嘿嘿……许多过程是简化深奥的,大伙还要此人 设计和面对每个环节。传统的线程池池开发也是如此,在有一另一个对象中,机会要使用另外的对象,就还要得到它(此人 new有一另一个,机会从JNDI中查询有一另一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和许多的接口或类藕合起来。

  全都控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,之后创建对象的主动权和创建时机是由此人 把控的,而现在许多权力转移到第三方,比如转移交给了IoC容器,它因此有一另一个专门用来创建对象的工厂,我想那先 对象,它之后他那先 对象,有了 IoC容器,依赖关系就变了,原来的依赖关系就都如此,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

  用图例说明一下,传统线程池池设计如图2-1,总要 主动去创建相关对象因此再组合起来:

  ●谁控制谁,控制那先 传统Java SE线程池池设计,大伙直接在对象内部内部结构通过new进行创建对象,是线程池池主动去创建依赖对象;而IoC是有专门有一另一个容器来创建那先 对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制那先 ?那因此主要控制了内部内部结构资源获取(不因此对象包括比如文件等)

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

  ●谁注入谁:很明显是IoC容器注入线程池池某个对象,线程池池依赖的对象

  ●为啥是反转,那先 方面反转了有反转总要 正转,传统线程池池是由大伙此人 在对象中主动控制去直接获取依赖对象,也因此正转;而反转则是由容器来帮忙创建及注入依赖对象;为啥是反转?机会由容器帮大伙查找及注入依赖对象,对象因此被动的接受依赖对象,全都是反转;那先 方面反转了?依赖对象的获取被反转了。

  如此IoC是怎么都能不能做的呢?不为啥像通过婚介找女大伙,在我和女大伙之间引入了有一另一个第三者:友情介绍所。婚介管理了全都男男女女的资料,我想向婚介提出有一另一个列表,告诉它我想找个那先 样的女大伙,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,传输速率像卡洛斯,技术像齐达内类事的,因此婚介就会按照大伙的要求,提供有一另一个mm,大伙只还要去和她谈恋爱、结婚就行了。简单明了,机会婚介给大伙的人选不符合要求,大伙就会抛出异常。整个过程不再由我此人 控制,因此有婚介原来有一另一个类事容器的机构来控制。Spring所倡导的开发最好的妙招因此如此,所有的类总要在spring容器中登记,告诉spring你是个那先 东西,你还要那先 东西,因此spring会在系统运行到适当的之后,把我想的东西主动让他,同時 也把你交给许多还要你的东西。所有的类的创建、销毁都由 spring来控制,也因此说控制对象生存周期的不再是引用它的对象,因此spring。对于某个具体的对象而言,之后是它控制许多对象,现在是所有对象都被spring控制,全都这叫控制反转。

  首如此分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全版来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846

  ●谁依赖于谁:当然是线程池池依赖于IoC容器

  ●注入了那先 :因此注入某个对象所还要的内部内部结构资源(包括对象、资源、常量数据)

  对于Spring Ioc许多核心概念,我相信每有一另一个学习Spring的人总要有此人 的理解。许多概念上的理解如此绝对的标准答案,仁者见仁智者见智。机会有理解只有位机会理解错的地方,欢迎广大园友指正!

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