谈谈对Spring IOC的理解

  • 时间:
  • 浏览:2
  • 来源:uu快3新平台_uu快3诀窍_讨论群

  对于Spring Ioc这名 核心概念,我相信每一一一3个多学习Spring的人都会有当事人的理解。这名 概念上的理解如此绝对的标准答案,仁者见仁智者见智。可能有理解还能不能了位可能理解错的地方,欢迎广大园友指正!

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

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

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

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

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这名 一一3个多概念,对于初学Spring的人来说,总虽然IoC 、DI这名 一一3个多概念是模糊不清的,是真难理解的,今天和朋友 分享网上的这名 技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。

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

  ●谁控制谁,控制那此传统Java SE程序池池设计,朋友 直接在对象内部管理通过new进行创建对象,是程序池池主动去创建依赖对象;而IoC是有专门一一一3个多容器来创建那此对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制那此?那可是我我主要控制了内部管理资源获取(不必是我对象包括比如文件等)

  Ioc—Inversion of Control,即“控制反转”,与否那此技术,可是我我并与否设计思想。在Java开发中,Ioc是因为将你设计好的对象交给容器控制,可是我我与否传统的在你的对象内部管理直接控制。怎样才能理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制那此,缘何是反转(有反转就应该有正转了),那此方面反转了”,原来们来深入分析一下:

  ●注入了那此:可是我我注入某个对象所能不能 的内部管理资源(包括对象、资源、常量数据)



  IoC 与否并与否技术,可是我我并与否思想,一一一3个多重要的面向对象编程的法则,它能指导朋友 怎样才能设计出松耦合、更优良的程序池池。传统程序池池与否由朋友 在类内部管理主动创建依赖对象,从而是因为类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,全都对象与对象之间是 松散耦合,原来也方便测试,不利于功能复用,更重要的是使得程序池池的整个体系形态变得非常灵活。

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

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

  IoC的一一一3个多重点是在系统运行中,动态的向某个对象提供它所能不能 的这名 对象。这名 点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A能不能 操作数据库,完后 朋友 经常要在A中当事人编写代码来获得一一一3个多Connection对象,有了 spring朋友 就只能不能 告诉spring,A中能不能 一一一3个多Connection,至于这名 Connection缘何构造,啥后后构造,A不能不能 知道。在系统运行时,spring会在适当的完后 制造一一一3个多Connection,因此像打针一样,注射到A当中,原来就完成了对各个对象之间关系的控制。A能不能 依赖 Connection能不能正常运行,而这名 Connection是由spring注入到A中的,依赖注入的名字就如此来的。如此DI是怎样才能实现的呢? Java 1.3完后 一一一3个多重要形态是反射(reflection),它允许程序池池在运行的完后 动态的生成对象、执行对象的法律方法、改变对象的属性,spring可是我我通过反射来实现注入的。

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



  IoC和DI由那此关系呢?虽然它们是同一一一3个多概念的不同淬硬层 描述,可能控制反转概念比较含糊(可能可是我我理解为容器控制对象这名 一一3个多层面,真难给你想到谁来维护对象关系),全都1504年大师级人物Martin Fowler又给出了一一一3个多新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

  在平时的java应用开发中,朋友 要实现某一一一3个多功能可能说是完成某个业务逻辑时合适能不能 一一一3个多或以上的对象来战略战略合作完成,在如此使用Spring的完后 ,每个对象在能不能 使用他的战略战略合作对象时,当事人均要使用像new object() 原来的语法来将战略战略合作对象创建出来,这名 战略战略合作对象是由当事人主动创建出来的,创建战略战略合作对象的主动权在当事人手上,当事人能不能 哪个战略战略合作对象,就主动去创建,创建战略战略合作对象的主动权和创建时机是由当事人把控的,而原来就会使得对象间的耦合度高了,A对象能不能 使用战略战略合作对象B来一并完成一件事,A要使用B,如此A就对B产生了依赖,也可是我我A和B之间处于并与否耦合关系,因此是紧密耦合在一并,而使用了Spring完后 就不一样了,创建战略战略合作对象B的工作是由Spring来做的,Spring创建好B对象,因此存储到一一一3个多容器里边,当A对象能不能 使用B对象时,Spring就从存放对象的那个容器里边取出A要使用的那个B对象,因此交给A对象使用,至于Spring是怎样才能创建那个对象,以及那此完后 创建好对象的,A对象不能不能 关心那此细节难题(你是那此完后 生的,缘何生出来的我可不关心,能我想干活就行),A得到Spring给朋友 的对象完后 ,一一一3个多人一并战略战略合作完成要完成的工作即可。

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

  这是我对Spring的IoC(控制反转)的理解。DI(依赖注入)虽然可是我我IOC的另外并与否说法,DI是由Martin Fowler 在1504年初的一篇论文中首次提出的。他总结:控制的那此被反转了?可是我我:获得依赖对象的法律方法反转了。

  ●为那此能不能 依赖:程序池池能不能 IoC容器来提供对象能不能 的内部管理资源

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

  ●缘何是反转,那此方面反转了有反转与否正转,传统程序池池是由朋友 当事人在对象中主动控制去直接获取依赖对象,也可是我我正转;而反转则是由容器来帮忙创建及注入依赖对象;缘何是反转?可能由容器帮朋友 查找及注入依赖对象,对象可是我我被动的接受依赖对象,全都是反转;那此方面反转了?依赖对象的获取被反转了。

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

图1-2有IoC/DI容器后程序池池形态示意图

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

  虽然IoC对编程带来的最大改变与否从代码上,可是我我从思想上,处于了“主从换位”的变化。程序池池原来是老大,要获取那此资源与否主动出击,因此在IoC/DI思想中,程序池池就变成被动的了,被动的等待英文IoC容器来创建并注入它所能不能 的资源了。

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

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