什么是控制反转(IoC, Inversion Of Control)?
最近在Spring Boot,顺便温习Java相关的东西,看到的相关的资料和书籍中,经常提到控制反转(IoC Inversion of Control),看的比较模糊,于是花了点时间找了一些资料,对控制反转有了一个简单的理解,在这里简短的记录一下。
控制反转其实是一个比较古老的概念,现在其实已经不怎么提及这个事儿了,为什么呢?在我看来,主要是因为软件领域的工作模式已经发生了一些变化。在软件发展的上古时期,也就是大师辈出的上个时间50、60年代前后,那时的程序员应该叫做计算机科学家,他们大多对软件的诸多领域都有深入的认识,很多人都可以独立完成从硬件到软件到交付的全过程,所有代码都是自己(或者团队)独立完成,基本上不依赖第三方(那时似乎也没有第三方)。比如那个时候写个博客网站,很多人直接就是些html了,一些网页应用,背后也是通过cgi部署在服务上的一些perl脚本。
在这个时期,软件的作者控制着软件的一切,他决定着软件的信息流,软件里的一切几乎都是可控的。假设我们在那个时期,要写一个“把大象装冰箱”的程序,我们要自己找到冰箱的API,自己控制程序打开冰箱,针对不同的冰箱,可能还得写不同的代码;然后在自己设计方法把大象装进去,最后把冰箱门关上。在这个过程中,冰箱怎么打开是我们控制的,冰箱怎么关上也是我们自己控制的,把大象装进去这个事儿,当然更是由我们自己控制。这个过程可以抽象为以下控制关系:

后来,随着时间的推移,大家发现彼此写了很多功能几乎一样的软件,再全人类这个角度看,这是一种对智力资源的浪费,于是一群大牛们聚到一起,倡导开源,倡导不要重复造轮子(DRY,Dont Repeat Yourself),于是,就有了一系列的公用的软件框架。比如像Spring这种。那“把大象装冰箱”来说,这个时候,我们可能有了一个框架,叫做ElephantRefrigerator,这个框架兼容了市面上所有的主流冰箱,可以通过简单的调用open、close就完成冰箱的打开和关闭,我们使用这个冰箱的话,就只需要实现一个方法就好(put_elephant_in),其他的事儿都由框架完成了。这种情况下,整个软件的基本流程就不是我们自己控制了,而是由框架控制,此时此刻,就发生了控制反转。这个新的过程可以抽象为以下控制关系:

控制反转的过程,我认为就是软件写作越来越快速、越来越模块化的一个过程,所以很多年轻的程序员都不知道什么是控制反转,因为他们从开始接触编程,就是各种框架各种飞,根本没控制过啥,都是控制反转的一代人,所以就不知道控制反转是啥了,就像鱼不知水一样。