一、什么是ioc?
首先要强调的是ioc是一种编程思想,而不是技术。ioc的全称叫inversion of control,即控制反转的意思。那控制反转又是什么意思呢?通俗点来说就是原来你控制的事情,现在不再由你来控制。在java传统的编程设计中,我们在对象内部通过new来创建对象,而ioc编程设计则由一个专门的容器来创建、管理这些对象。
二、为什么要用ioc?
第一:对象的实例化不是一件简单的事情,比如对象的关系比较复杂,依赖关系往往需要程序员去维护,这是一件非常头疼的事。
第二:解耦,由容器去维护具体的对象
第三:托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分过程交给容器,应用程序则无需去关心类是如何完成代理的
传统应用程序由我们主动查找、在类中创建所需对象,导致类与类之间的高耦合性,不利于程序扩展和维护。有了ioc容器后,对象的创建与注入均由容器控制与维护,降低了类与类之间的耦合性,有利于功能复用,程序扩展和维护。
三、ioc的两种实现DI和DL
1.依赖注入DI(Depedency Injection):其有三种实现:构造函数注入,设置方法注入和接口注入
2.依赖查找DL(Dependency Lookup):依赖拖拽,上下文依赖查找
2.1依赖拖拽:
注入的对象如何与组件发生联系,这个过程就是通过依赖拖拽实现 。(较少有使用)
2.2上下文依赖查找:
在某些方面跟依赖拖拽类似,但是上下文依赖查找中,查找的过程是在容器管理的资源中进行的,而不是从集中注册表中,并且通常是作用在某些设置点上。(DL 已经被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。即有侵入性。)
两者的区别是:上下文依赖查找是在业务组件代码中进行的,而依赖拖拽是从一个集中的注册处,特定的地点执行。
四、使用DI实现ioc的框架
使用 DI 方式实现 IoC 的不止 Spring,包括 Google 的 Guice,还有一个冷门的 PicoContainer(极度轻量,但只提供 IoC)。
在最初,Spring使用XML配置文件的方式来描述bean的定义以及相互间的依赖关系,但随着Spring的发展,越来越多的人对这种方式表示不满,因为Spring项目的所有业务类均以bean的形式配置在XML文件中,造成了大量的XML文件,使项目变得复杂且难以管理。
后来,基于纯Java Annotation依赖注入框架 Guice
出世,其性能明显优于采用XML方式的Spring,甚至有部分人认为, Guice
可以完全取代Spring( Guice
仅是一个轻量级IOC框架,取代Spring还差的挺远)。正是这样的危机感,促使Spring及社区推出并持续完善了 JavaConfig
子项目,它基于Java代码和Annotation注解来描述bean之间的依赖绑定关系。因此才有了spring boot!
参考文章:
https://www.jianshu.com/p/26654a18d1fe
https://blog.csdn.net/qq_22654611/article/details/52606960/
https://blog.51cto.com/luecsc/1964056
更多内容请关注微信公众号“外里科技”
官方公众号 | 外里科技 |
运营公众号 | 英雄赚 |
微信 | wxid_8awklmbh1fzm22 |
1247408032 | |
开源代码 | https://gitee.com/B_T/beimi |