控制反转及注入依赖详情「通俗易懂」
今天我们开始接触spring框架,学习这个框架前,我们首先要了解一下什么是IOC(控制反转)和DI(注入依赖)这两个概念,对于很多初学者来说,这两个概念总是模糊不清的,也是非常难理解的,我们这节课就来聊聊控制反转和注入依赖的区别,也就是IOC和DI的区别!
1、IOC是什么?
ioc就是控制反转,不是什么技术,而是spring中的一种思想。在spring中,ioc意味着将你设计好的对象交给spring的容器进行控制,而不是传统的在你对象内部进行控制。
说白了,就是不需要你再去实例某个类,并给这个类的n多个属性进行赋值,这些实例出某个对象并给对象添加属性的操作,都是非常繁琐的事情。而ioc就是将这些繁琐的事情交给了spring的容器。
2、控制反转,到底是谁控制谁?又是反转了什么呢?
在我们传统的java开发中,也就是没有使用框架的开发中,我们都是在对象内部通过new进行创建对象,是程序主动去创建程序所依赖的对象,而spring呢,使用ioc容器控制了对象,当然,真正在spring中,控制的不一定是项目中的对象,也有一些其他的,比如说文件。
至于反转,是相对来说的。我们传统开发,也就是类中创建对象的方式就是所谓的“正转”,那现在不需要对象来创建对象了,而是容器帮我们查找并注入依赖对象,而对于对象来说,他们只是被动的接受了创建,所以是反转。总的来说,依赖对象的获取被反转了。
3、IOC能做什么?
我前面说过,ioc不是一种技术,而是一种思想,是spring的面向对象编程的法则。使用控制反转,我们能设计出松耦合、更加优良的程序。在传统的编程中,我们在对象中创建对象,一旦前者有改动,很容易影响到后者,所以耦合度相对来说较高,而控制反转就是解决了这个问题。
再一个,我们使用了ioc的思想后,把创建和查找依赖对象的任务交给了容器,由容器统一注入对象,这样也方便我们开发过程中查找、修改、测试。试想一下,一百个对象在项目创建的话,是分布在一百个类中方便我们查看,还是在一个配置文件中方便我们查看?
4、什么是DI?
di,就是“依赖注入”,组件(可以暂且理解为上面的对象)之间存在依赖关系,这些关系就是由容器在运行期决定,说白了,就是由容器动态的将某个依赖关系注入到组件之中。
依赖注入的目的,并不是为了软件系统能实现更多的功能,而是为了提升组件重用的频率,搭建一个更加灵活、可扩展的平台。想象一下,哪个对象中需要实例哪个对象,我们可以在配置文件中像操作开关一样的改变,不是方便了很多吗?
5、能不能用一句话来总结ioc和di呢?
说的再通俗易懂一些,控制反转就是把对象的控制权交给了spring容器,注入依赖就是帮助容器去管理这些对象之间的关系。