IOC是什么
控制反转,本质上是一种新型的设计模式,在Springboot中有着广泛的运用;同时也成为了Springboot最重要的特征之一。
IOC的思想,可以理解为一种“中介”的思想。
我们经常可以在各种地方看到,“IOC是一种解耦的思想”之类的话,但是它是如何实现解耦的?
打个比方,比如说你想找对象结婚。正常情况下,如果你要找对象,就是你主动去发出找对象的这个动作。
但是你还有另一种方法——你去找婚姻中介。
中介手上有各种各样的对象的信息,于是中介就可以主动把你要找的对象提供给你。
通过加一个“中介”,来减少你跟“对象“之间的耦合。
对应在程序上,就是下面两个图的差别:
这个IOC容器就是“中介”,他知道其他“对象”的信息,等你要一个对象了他就直接给你分配你要的那种type。
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
IOC(控制反转)与DI(依赖注入)
2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
我们举一个生活中的例子,来帮助理解依赖注入的过程。大家对USB接口和USB设备应该都很熟悉吧,USB为我们使用电脑提供了很大的方便,现在有很多的外部设备都支持USB接口。
IOC在SpringBoot之中的实现
通过反射机制+XML实现
Springboot的流程:
- 初始化Spring容器
- 获取扫描包下所有class
- 解析class中的注解信息
- 封装类反射后实例化对象
- 以<beanid,bean实例化对象(包含bean中的方法信息)>存储
- 本地方法调用bean中的方法的时候:
- getbean
- Bean的实例化类对象
- Bean的具体方法以及执行结果
下一期复习一下反射。