Spring 揭秘之IoC的基本概念

《Spring 揭秘》读书心得之第二章 IoC的基本概念

IoC的理念

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

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

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

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

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

DI的三种方式

这里的DI,全称为Dependency Injection。依赖注入。没错,我们就是通过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不仅是个Good Man,而且还是个Super Man。很厉害,对不对。他还有个名字,叫:IoC Service Provider

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

IoC的附加值

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

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值