台州新闻门户网站

Spring依赖注入和控制反转的理解,写的太好了

关注我,私信[电子书],[视频],你可以获得大量高质量的电子书和大数据,kafka,nginx,MySQL等视频资料

那些研究过Spring框架的人一定听说过Spring的IoC(控制反转)和DI(依赖注入)概念。对于那些刚接触Spring的人,我总觉得IoC和DI这两个概念含糊不清。这很难理解。今天,我与大家分享一些了解Spring框架IOC的技术人才,并谈谈我对Spring Ioc的理解。

I.分享Iteye的Kaitao对Ioc的精彩解释

首先要分享的是Iteye的Kai Tao,他是了解Spring框架的IOC的技术牛。这很容易理解。以下内容来自原文。原地址:

1.1,什么是IoC

Ioc-Inversion of Control,即“控制反转”,不是一种技术,而是一种设计理念。在Java开发中,Ioc意味着将您设计的对象传递给容器控件,而不是传统地直接在对象内部控制它们。如何理解Ioc?理解Ioc的关键是澄清“谁控制谁,什么控制,为什么逆转(如果存在逆转就应该出现逆转),以及哪些方面被逆转”,那么让我们深入分析一下:

●谁控制谁控制什么:传统的Java SE编程,我们通过new直接在对象内创建对象,程序主动创建依赖对象;和IoC有一个特殊的容器来创建这些对象,即Ioc容器Control对象的创建;谁控制谁?当然,IoC容器控制对象;它控制什么?这主要是为了控制外部资源的获取(不仅仅是文件等对象)。

●为什么它会逆转,哪些方面会逆转:当出现逆转时会出现正转。传统的应用程序由我们自己的对象主动控制,直接获取依赖对象,即正向旋转;而反面是容器。帮助创建和注入依赖项;为什么会逆转?因为容器帮助我们找到并注入依赖对象,所以对象只是被动地接受依赖对象,所以它是相反的;哪些方面有所逆转?依赖对象的获取是相反的。

作为一个传说,传统的编程如图2-1所示,它是主动创建相关对象,然后将它们组合在一起:

图1-1传统应用程序的示意图

当IoC/DI容器可用时,它们不再在客户端类中主动创建,如图2-2所示。

图1-2 IoC/DI容器后的程序结构示意图

1.2,IoC可以做什么?

IoC不是一种技术,只是一种想法,是面向对象编程的一个重要原则,它可以指导我们如何设计松散耦合的更好的程序。在传统的应用程序中,我们主动在类中创建依赖对象,这导致类和类之间的高度耦合。很难测试。使用IoC容器,可以为容器提供用于创建和查找依赖对象的控件。注入组合对象,使对象与对象松散耦合,这也便于测试,便于函数重用,更重要的是,使程序的整个架构非常灵活。

事实上,IoC给编程带来的最大变化不是来自代码,而是来自思想,“主 - 从”的变化发生了。该应用程序最初是老板,获取的资源是主动的,但在IoC/DI思想中,应用程序变得被动,被动地等待IoC容器创建并注入所需的资源。

IoC是面向对象设计规则之一的一个很好的例子。好莱坞法律:“不要找我们,我们在找你”;也就是说,IoC容器帮助对象找到相应的依赖对象并将其注入,而不是主动寻找它的对象。

1.3,IoC和DI

DI-Dependency Injection,它是一个依赖注入。组件之间的依赖关系由容器在运行时确定。在映像中,容器动态地将依赖项注入组件。依赖注入的目的不是为软件系统带来更多功能,而是为了增加组件重用的频率并为系统构建灵活且可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置指定目标所需的资源而无需任何代码,并完成自己的业务逻辑,而无需关心特定资源的来源和实现者。

理解DI的关键是:“谁取决于谁,你为什么需要依赖,谁注射,注射什么”,然后让我们深入分析:

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

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

谁注入:很明显IoC容器注入了应用程序的对象,应用程序所依赖的对象;

注入的内容:注入对象所需的外部资源(包括对象,资源和常量数据)。

IoC和DI之间有什么关系?实际上,它们是同一概念的不同角度。因为控制反转的概念含糊不清(可能只是被理解为一层容器控制对象,很难想象谁将保持对象关系),所以2004年的主人马丁福勒给出了一个新名称:“依赖注射”。相对于IoC,“依赖注入”明确描述了“注入的对象依赖于IoC容器配置依赖对象”。

我读过很多关于Spring的Ioc理解的文章。许多人误解了Ioc和DI的解释。无论如何,这是一种不清楚和不清楚的感觉。读完之后,它仍然是一片迷雾,感觉就像凯涛。技术牛是以一种特别容易理解的方式编写的。他清楚地解释了IoC(控制反转)和DI(依赖注入)中的每一个字,在阅读后给人一种开放的感觉。我相信在Spring框架中对初学者的Ioc的理解应该是非常有帮助的。

其次,在Bromon的博客上分享易于理解的IoC和DI解释

2.1,IoC(控制反转)

首先,我想谈谈IoC(控制反转)。这是整个春天的核心。对于spring框架,所谓的IoC负责控制对象的生命周期和对象之间的关系。这是什么意思?举个简单的例子,我们如何找到女朋友?常见的情况是,我们到处去看看哪里有好看和好mm,然后询问他们的爱好,QQ,电话号码,IP号码,iq号..想办法知道他们并为他们投票。发送它想要的东西真好,然后嘿嘿.这个过程既复杂又深刻,我们必须自己设计和面对每个环节。传统的程序开发也是如此。在一个对象中,如果要使用另一个对象,则必须获取它(新的,或从JNDI查询一个),并在使用后销毁该对象(如Connection等)。对象始终与其他接口或类组合。

那么IoC是如何完成的?这有点像通过婚介寻找女朋友,在我和我的女朋友之间引入第三方:婚姻代理。媒人负责管理许多男女的信息。我可以给媒人列一份清单,然后告诉他我想找到什么样的女朋友,比如看起来像林熙蕾的李嘉欣,像周杰伦一样唱歌,像卡洛斯一样的速度,像达纳之类的技术,然后是配对将根据我们的要求提供mm,我们只需要去爱上她,结婚。简单明了,如果比赛给我们的人不符合要求,我们将抛出异常。整个过程不再由我自己控制,而是由类似容器的机构控制,如配对。 Spring提倡的开发方法就是这样。所有类都将在弹簧容器中注册,告诉你你是什么,你需要什么,然后spring将在系统正常运行时为你提供你想要的东西。并将你交给其他需要你的东西。所有类的创建和销毁都由spring控制,这意味着控制对象的生命周期不再是引用它的对象,而是spring。对于特定对象,它用于控制其他对象。现在所有对象都由spring控制,因此这称为控制反转。

2.2,DI(依赖注入)

IoC的一个关键点是在系统运行时动态地为对象提供所需的其他对象。这是通过DI(依赖注入)实现的。例如,对象A需要操作数据库。我们曾经在A中编写自己的代码来获取Connection对象。使用spring,我们只需告诉spring我们需要在A中连接。至于如何以及何时构造此Connection,A不需要知道。当系统运行时,弹簧将在正确的时间进行连接,然后像针一样将其注入A,从而完成对各种物体之间关系的控制。需要依赖Connection才能正常工作,并且这个Connection通过spring注入A,这就是依赖注入的名称。 DI如何实施?在Java 1.3之后,一个重要的特性是反射,它允许程序动态生成对象,执行对象的方法,并在运行时更改对象的属性。弹簧是通过反射注入的。

一旦理解了IoC和DI的概念,一切都会变得简单明了。其余的工作只是在Spring框架中构建块。

III。我对IoC(控制反转)和DI(依赖注入)的理解

在通常的Java应用程序开发中,我们需要实现至少一个或多个对象来实现某个功能或完成某个业务逻辑。不使用Spring时,每个对象都需要使用它。与对象协作时,必须使用类似new object()的语法来创建协作对象。此合作对象由您自己创建。创建合作对象的倡议掌握在自己手中。你需要哪个合作对象?主动创造,创造合作对象的主动权和创造时间是由自己控制的,这将使对象之间的耦合程度,一个对象需要使用合作对象B来一起完成一件事,A要使用B,然后A依赖于B,也就是说,A和B之间存在耦合关系,并且它是紧耦合的。使用Spring后,情况就不同了。创建合作对象B的工作是Spring,Spring创建一个B对象,然后将其存储在容器中。当A对象需要使用B对象时,Spring会存储该对象。容器获取A想要使用的B对象,然后将其交给A对象。至于Spring如何创建对象以及何时创建对象,A对象不需要关心这些细节(你什么时候出生?)我不在乎我是否出生,我可以帮助我工作。)在A得到Spring给我们的对象之后,两个人一起工作来完成要完成的工作。

因此,控制反转(IoC)意味着传输对创建对象的控制。创建对象和创建时间的主动权由其自身控制,现在权力被转移到第三方,例如转移到IoC容器,IoC容器是专门用于创建对象的工厂,您想要什么对象,以及它给你什么对象。使用IoC容器,依赖关系发生变化,原始依赖关系消失了,它们都依赖于IoC。容器,通过IoC容器建立它们之间的关系。

这是我对Spring的IoC(控制反转)的理解。 DI(依赖注入)实际上是另一种说法,即IOC是由Martin Fowler在2004年初的一篇论文中首次提出的。他总结说:控制的是什么?那就是:获得依赖对象的方式是相反的。

四,总结

对于Spring Ioc的核心概念,我相信每个学习Spring的人都会有自己的理解。这种概念性的理解没有绝对的标准答案,仁慈的人看到智慧,看到智慧。如果你有一个你不理解或不理解的地方,欢迎你纠正它!

资料来源:

推广应用