谈谈对Spring IOC的理解

  • 时间:
  • 浏览:1

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

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

  IoC的4个 重点是在系统运行中,动态的向某个对象提供它所时要的或多或少对象。你你你这个点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A时要操作数据库,随后或多或少人总爱要在A中人及 编写代码来获得4个 Connection对象,有了 spring或多或少人就只时要告诉spring,A中时要4个 Connection,至于你你你这个Connection为何会么会构造,几时构造,A不时要知道。在系统运行时,spring会在适当的随后制造4个 Connection,为何让像打针一样,注射到A当中,曾经就完成了对各个对象之间关系的控制。A时要依赖 Connection有助正常运行,而你你你这个Connection是由spring注入到A中的,依赖注入的名字就没办法 来的。没办法 DI是要怎样实现的呢? Java 1.3随后4个 重要行态是反射(reflection),它允许系统进程在运行的随后动态的生成对象、执行对象的措施、改变对象的属性,spring统统 通过反射来实现注入的。

  我我着实IoC对编程带来的最大改变删剪不会从代码上,统统 从思想上,处在了“主从换位”的变化。应用系统进程曾经是老大,要获取哪此资源删剪不会主动出击,为何让在IoC/DI思想中,应用系统进程就变成被动的了,被动的守候IoC容器来创建并注入它所时要的资源了。

图1-1 传统应用系统进程示意图

图1-2有IoC/DI容器后系统进程行态示意图

  ●谁依赖于谁:当然是应用系统进程依赖于IoC容器

  ●为哪此时要依赖:应用系统进程时要IoC容器来提供对象时要的内部内部结构资源

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



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

  理解DI的关键是:“谁依赖谁,为哪此时要依赖,谁注入谁,注入了哪此”,曾经们来深入分析一下:

  这是我对Spring的IoC(控制反转)的理解。DI(依赖注入)我我着实统统 IOC的另外某种生活说法,DI是由Martin Fowler 在1004年初的一篇论文中首次提出的。他总结:控制的哪此被反转了?统统 :获得依赖对象的措施反转了。

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

  没办法 IoC是要怎样做的呢?很重像通过婚介找女或多或少人,在我和女或多或少人之间引入了4个 第三者:夫妻夫妻感情介绍所。婚介管理了统统有男男女女的资料,我你要向婚介提出4个 列表,告诉它我你要找个哪此样的女或多或少人,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,带宽像卡洛斯,技术像齐达内之类的,为何让婚介就会按照或多或少人的要求,提供4个 mm,或多或少人只时要去和她谈恋爱、结婚就行了。简单明了,可能婚介给或多或少人的人选不符合要求,或多或少人就会抛出异常。整个过程不再由人及 控制,统统 有婚介曾经4个 之类容器的机构来控制。Spring所倡导的开发措施统统 没办法 ,所有的类不会在spring容器中登记,告诉spring你是个哪此东西,你时要哪此东西,为何让spring会在系统运行到适当的随后,把我你要的东西主动你要,并肩也把你交给或多或少时要你的东西。所有的类的创建、销毁都由 spring来控制,也统统 说控制对象生存周期的不再是引用它的对象,统统 spring。对于某个具体的对象而言,随后是它控制或多或少对象,现在是所有对象都被spring控制,统统有这叫控制反转。

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

  统统有控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,随后创建对象的主动权和创建时机是由人及 把控的,而现在你你你这个权力转移到第三方,比如转移交给了IoC容器,它统统 4个 专门用来创建对象的工厂,我你要哪此对象,它就你要哪此对象,有了 IoC容器,依赖关系就变了,曾经的依赖关系就什么都没办法 ,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

  首先想励志的话 IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,统统 由spring来负责控制对象的生命周期和对象间的关系。这是哪此意思呢,举个简单的例子,或多或少人是要怎样找女或多或少人的?常见的具体情况是,或多或少人到处去看哪里有长得漂亮身材又好的mm,为何让打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想措施认识她们,投其所好送其所要,为何让嘿嘿……你你你这个过程是繁复深奥的,或多或少人时要人及 设计和面对每个环节。传统的系统进程开发也是没办法 ,在4个 对象中,可能要使用另外的对象,就时要得到它(人及 new4个 ,可能从JNDI中查询4个 ),使用完随后时要将对象销毁(比如Connection等),对象始终会和或多或少的接口或类藕合起来。

  IoC 删剪不会某种生活技术,统统 某种生活思想,4个 重要的面向对象编程的法则,它能指导或多或少人要怎样设计出松耦合、更优良的系统进程。传统应用系统进程删剪不会由或多或少人在类内部内部结构主动创建依赖对象,从而意味 类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,统统有对象与对象之间是 松散耦合,曾经也方便测试,有助功能复用,更重要的是使得系统进程的整个体系行态变得非常灵活。

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

  对于Spring Ioc你你你这个核心概念,我相信每4个 学习Spring的人不会有人及 的理解。你你你这个概念上的理解没办法 绝对的标准答案,仁者见仁智者见智。可能有理解里能 位可能理解错的地方,欢迎广大园友指正!

  用图例说明一下,传统系统进程设计如图2-1,删剪不会主动去创建相关对象为何让再组合起来:

  Ioc—Inversion of Control,即“控制反转”,删剪不会哪此技术,统统 某种生活设计思想。在Java开发中,Ioc意味 将你设计好的对象交给容器控制,而删剪不会传统的在你的对象内部内部结构直接控制。要怎样理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制哪此,为何会么会会是反转(有反转就应该有正转了),哪此方面反转了”,曾经们来深入分析一下:

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

  ●为何会么会会是反转,哪此方面反转了有反转删剪不会正转,传统应用系统进程是由或多或少人人及 在对象中主动控制去直接获取依赖对象,也统统 正转;而反转则是由容器来帮忙创建及注入依赖对象;为何会么会会是反转?可能由容器帮或多或少人查找及注入依赖对象,对象统统 被动的接受依赖对象,统统有是反转;哪此方面反转了?依赖对象的获取被反转了。

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



  IoC和DI由哪此关系呢?我我着实它们是同4个 概念的不同带宽描述,可能控制反转概念比较含糊(可能统统 理解为容器控制对象你你你这个个 层面,好难你要想到谁来维护对象关系),统统有1004年大师级人物Martin Fowler又给出了4个 新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

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

  在平时的java应用开发中,或多或少人要实现某4个 功能可能说是完成某个业务逻辑时要花费时要4个 或以上的对象来商务商务合作完成,在没办法 使用Spring的随后,每个对象在时要使用他的商务商务合作对象时,人及 均要使用像new object() 曾经的语法来将商务商务合作对象创建出来,你你你这个商务商务合作对象是由人及 主动创建出来的,创建商务商务合作对象的主动权在人及 手上,人及 时要哪个商务商务合作对象,就主动去创建,创建商务商务合作对象的主动权和创建时机是由人及 把控的,而曾经就会使得对象间的耦合度高了,A对象时要使用商务商务合作对象B来并肩完成一件事,A要使用B,没办法 A就对B产生了依赖,也统统 A和B之间处在某种生活耦合关系,为何让是紧密耦合在并肩,而使用了Spring随后就不一样了,创建商务商务合作对象B的工作是由Spring来做的,Spring创建好B对象,为何让存储到4个 容器中间,当A对象时要使用B对象时,Spring就从存放对象的那个容器中间取出A要使用的那个B对象,为何让交给A对象使用,至于Spring是要怎样创建那个对象,以及哪此随后创建好对象的,A对象不时要关心哪此细节大难题(你是哪此随后生的,为何会么会生出来的我可不关心,能我你要干活就行),A得到Spring给或多或少人的对象随后,4个 人并肩商务商务合作完成要完成的工作即可。