记录对Spring IOC的一点理解
一锅炖不下

与一个对象有关的职责大致有三大类——

  • 第一类是创建的职责,即实例化对象,并为对象提供它工作所需的依赖。依赖多种多样,可以是另一个对象,也可以是某个值等等。
  • 第二类是对象本身的功能上的职责,即这个对象提供的一些方法,以及它所储存的数据等。
  • 第三类是使用对象的职责,即调用该对象的方法完成一些事情的职责。

从这个角度看,IOC(控制翻转)就是一种将创建的职责和对象本身的职责分离开来的思想,通过满足面向对象倡导的单一职责原则,实现了这两种职责之间的解耦。

Spring是通过DI(依赖注入)来实现控制翻转的。首先需要清楚如果没有这样的机制,程序会怎样创建对象——通常会new一个新对象,通过构造函数传入所需的依赖,也可以通过set方法,这样做有什么不好吗?首先,new对象这种方式用因为其硬编码的特性,就把一个接口的具体实现类定死了,后续如果要更换该接口的实现类,只能修改源代码,这就丧失了灵活性,无法通过配置文件等方式更灵活地处理这样地情景。其次,new对象这种方式也将对象的创建位置固定了,A类在某处创建了另B类,当C类要使用的时候又得自己重新再创建一个,这样做无疑是一种浪费。当然,这个问题可以通过增加某个缓存类来解决,例如通过工厂建立对象,并维护一个对象的单例缓存,Spring解决这个问题的思路与此类似。

而在有了Spring之后,事情就简单了,只需要注解声明哪些对象需要作为bean被管理,哪些依赖需要被注入,Spring通通可以帮开发者搞定。同时这也提供了极大的灵活性,如果想要更换某个接口的实现类,只需要通过配置注入一个用户自己的实现即可。