javaee论坛

普通会员

225648

帖子

328

回复

342

积分

楼主
发表于 2019-10-30 14:58:31 | 查看: 117 | 回复: 2

文章目录《Spring揭秘》读书心得之第二章IoC的基本概念IoC的理念DI的三种方式Setter注入Constructor注入Interface注入IoC的附加值

IoC的理念

IoC,全称InversionofControl。理解IoC,需要理解两个词:Inversio和Control。

实际上,IoC作为一种理念,不仅存在于编程世界,现实世界也存在哦。著名的就是好莱坞原则“Don’tcallus,wewillcallyou”。演员找导演拍戏,那么“控制”在演员,“控制”表现在演员可以决定找哪位导演;而“反转”就是“控制”的反转:由导演来找演员,“控制”表现在导演可以决定找哪位演员;“反转”之后,导演是不是很轻松了呢?因为导演不需要面对他不需要的演员了啊!

回到编程世界里,要完成一项任务,离不开对象之间的相互协作,而这种协作关系,我们也称为一种依赖关系;是不是和导演与演员的关系很像呢?像就对了!因为Java本来就是面向对象的编程语言,就是为了方便对现实世界的描述嘛~;前面提到“依赖关系”,那就得想想这依赖关系该如何建立了。

最直观的是:如果需要,就new一个吧!哪里需要哪里new!爸妈再也不用担心我的编程了。好吧,按照前面的分析,A需要B,那么A就new一个B。似乎没问题。但是,我们的目标是什么?没有蛀牙。是高内聚,低耦合啊。A因为要new一个B,那么总得为B的构造函数传递参数吧,这些参数是不是要A来准备?这样,A中的代码就知道的太多了。知道太多的类,最后都怎么了?都高耦合了呗。此时,“控制”在A。我们要反转的,就是这个依赖关系的建立。

A还是需要一个B的,但是,肯定不是A直接来创建一个B,那么总得有人来干这个活吧!代码哪有什么岁月静好,只是有人在为你负重前行。这个人是谁,暂且不提,但是他一定是个好人,下文称他为GoodMan,简称GM。我们来看看A如何获得B。

DI的三种方式

这里的DI,全称为DependencyInjection。依赖注入。没错,我们就是通过DI来实现IoC的~。这里有三种方式来实现DI。

Setter注入

A通过添加成员变量,并且添加一个B的Setter方法,GM(不知道GM是啥意思?回头瞅瞅吧)检测到A中有B,就创建一个B,然后通过A的Setter方法把现成的B给A。

Constructor注入

GM通过往A的构造函数中传入一个B来达到将其交给A的目的;

Interface注入

这种方法正在被淘汰。。。。它需要A实现一个接口,叫啥不重要,只需要有一个方法,该方法叫啥也不重要(实际上,这种方法也不重要。。。。),只要有个B参数就好。GM发现A实现了该接口,就会通过其方法将B传给A。

这种方法非要A实现一个不重要的接口,不友好;所以,逐渐被抛弃。。

从这三种方法来看,GM不仅是个GoodMan,而且还是个SuperMan。很厉害,对不对。他还有个名字,叫:IoCServiceProvider。

另外,有没有发现,A要使用B,就得将B作为一个成员变量,那么如果A只是有一个方法需要使用B,那也没有必要把B上升到成员变量的级别,只需要成为局部变量就好。但是,此场景就不是“注入”了,自然也就不再属于DI的范畴了。实际上,此时A可以向GM主动索要嘛,就像唐僧对孙悟空说:“你想要就告诉我嘛,你不说,我怎么知道你想要呢?”;

IoC的附加值

从主动获取依赖关系的方式转向IoC方式,不只是一个方向上的改变,简单的转变背后实际上蕴藏着更多的玄机:

不会对业务对象构成很强的侵入性;使用IoC后,对象具有更好的可测试性、可重用性和可扩展性

如果要用一句话来概括IoC可以带给我们什么,那么我希望是,IoC是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式!

这一章里,作者没有从对象解耦的角度对IoC给出介绍,而是从对象绑定方式的角度来介绍IoC的概念;很容易理解。

《Spring揭秘》在介绍概念的时候,不但会描述这个概念是什么样,还会描述为什么会是这个样子;学习过程就像是在打通任督二脉,而不是死记招式;超级棒!


普通会员

0

帖子

313

回复

324

积分
沙发
发表于 2022-05-11 02:12:27

围观

普通会员

7

帖子

229

回复

355

积分
板凳
发表于 2023-08-03 16:30:31

专业抢二楼!顺便笑摸狗头(3L)

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017