Spring模式系列(一) 控制反转 - Spring 框架的核心奥义

控制反转 - Inversion of Control

  • Inversion of Control 就是把创建程式依赖的责任交给容器,而核心程序并不需要知道如何创建它,它需要向容器去要依赖包的instance即可

Inversion of Control 是Spring框架的核心模式。在我看来, IoC是spring所有技术的根本。就好像武林高手驱动所有的招式的内功。一言以概之,IoC就是把创建程式依赖的责任交给容器,而核心程序并不需要知道如何创建它,它需要向容器去要依赖包的instance即可,这也是为什么很多人把这个模式叫做dependency injection,但这就是表明其中一个行为而已,真正的奥义是把控制反转。举个例子,比如说现在你的核心程序是建造一辆轿车,那么你要向供应商买车轮,车灯等等。作为核心程序,你不需要知道如何建造车轮,你只需要向供应商去购买即可。相当于你把建造车轮的责任交给了供应商,而你只需要关注你的核心业务即可 – 就是如何建造一辆好车。其实这个就像市场的原理,以前个体需要完成一件事情,需要知道所有的步骤,从而造成了效率的低下。自从分工和交易出现,效率大大地提高,社会也出现进步。

 

How Does It Work?

  • 在容器中建造管理对象的索引及状态
  • 在runtime的时候即插即用
  • 集中控制和管理

清楚了奥义后,那么现在说说这是如何工作的。首先我们需要有一个容器,这个容器的主要功能是管理objects的索引以及状态。当你的核心程序需要它时,容器就会在runtime或者启动的时候传入该object。这样做的好处是中央集中管理。Spring不会去插手你不让它碰的object,但是一旦你授权给它,它就会尽心尽责地在整个lifecycle中管理你授权的objects,一直等到程序结束后才会去销毁它们。当然也有例外,这个就是prototypes,这个我们以后再表。objects是在runtime插入,而并非在compile time插入。那这个意味着什么呢?众所周知,如果是在compile time的时候,程序员需要写构造的代码去示例化一个object,那么如果你有很多个地方需要用到这个实例,那么你就要做很多重复性的劳动去写一样的构造代码。在runtime的时候插入,程序员并不需要管如何建造,他在需要的时候,向Spring拿这个实例就可以了。当然你还是要写代码去让Spring知道如何构建改实例,但是这就是一次性功夫。

 

IoC的好处

  • 减少不必要逻辑代码(“噪声”代码)
  • 减少逻辑之间的耦合程度
  • 减少人为的bug

那么ioc的好处有什么呢?首先,它能保持你的代码摒弃掉不必要的逻辑而专注于你的核心业务逻辑。举个例子,你的程序的核心业务是统计数据并且得出一个有益于business的结论。那么假定你的程序需要向数据库读取数据,这个连接数据库的逻辑代码则是影响你核心逻辑的“噪声”。在我们之后的系列中,我会谈到如何使用template模式去减少噪声代码,在这里,IoC封装起这些连接数据库的逻辑,并且在runtime的时候直接向核心业务提供数据库的连接实例,这样你就能减少这种”噪声“代码。在这里你会发现另外一个好处,你的核心业务并不和连接数据库的逻辑捆绑在一起。也就是说,你可以很轻松地,尽量少地修改你的核心业务去替换掉这些实例。就好像你向换一种款式的轮胎,你只需要问供应商去要即可,你并不要对你的生产线大动干戈。当然,还有一个最后的好处,这是我个人的经验教训。人总是会犯错的,尤其是做无聊的复制粘贴的工作(因为警觉性较低了)也就是说,当你复制粘贴建造实例的逻辑时,你就会很容易犯错。 通过IoC,你就能减少人为的因素(因为你少做了重复性的劳动),从而减少犯错的机会。

 

ApplicationContext

  • Spring:ApplicationContext就是那个容器
  • 通过配置ApplicationContext,我们可以集中控制建造bean和管理依赖插入。

那么Spring的container是什么呢?Spring的container是用ApplicationContext 实现的。关于ApplicationContext的奥义,我以后会专门出一篇文章去讲讲,但是理解了IoC的奥义,就不难理解ApplicationContext的用法。同时ApplicationContext也利用了工厂模式,这个在之后的系列中我会主要谈到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值