天天看点

互联网面试-如何理解Spring框架中的控制反转(IOC)?

作者:架构师面试宝典
互联网面试-如何理解Spring框架中的控制反转(IOC)?

IOC(Inversion of Control),控制反转,其实控制反转并不是某种技术,而是一种软件程序设计思想。也就是在使用Spring框架的时候将需要使用对象交给了容器来进行控制,而不是由开发者自己来控制对象的创建与销毁。那么如何来更好的理解IOC操作呢?下面我们就来详细的介绍一下关于IOC的操作。

谁控制了谁?控制了那些内容?

对于传统的JavaSE编程来说,当我们在代码中需要使用一个对象的时候,需要通过new的方式来进行创建,并且这个创建过程是由使用程序主动的去创建并进行使用的。那么IOC的思想就是通过一个公共的容器来去控制创建这些对象。这样就解释了谁控制了谁?在IOC中就是容器控制了对象;控制的是什么?在JavaSE创建对象的时候,是使用者来进行创建的,但是在IOC中是由容器来创建的,那么自然,容器所控制的就是对于这些对象的具体的操作了。

互联网面试-如何理解Spring框架中的控制反转(IOC)?

图片来源网络

为什么会被称为是控制反转呢?

对于一个正常的调用来讲,都是在使用的时候使用者主动的去创建对象,然后进行调用。而IOC则是通过了一个对象容器来创建了这些对象,也就是说这些对象不管用不用都是在这个容器中的,也就是不需要我们再去主动的调用去创建对象了,我们只需要调用容器来使用这些对象就可以了。这个时候这些对象就可以看做是被动的接受我们的调用。所以所谓的反转就是指对象的获取方式被反转了,由原来的的主动调用,变成了被动被获取。

互联网面试-如何理解Spring框架中的控制反转(IOC)?

图片来源网络

IOC能做什么?

根据前面的介绍我们明白了IOC其实并不是一种技术,而是一种程序实现思想,是一种实现松耦合的编程思想。

在传统的JavaSE编程过程中都是通过主动调用来完成对象的创建工作。这样子程序与程序之间的耦合度过高。尽管有Java的三大特性的加持,但是还是会出现各种各样的问题。

有了IOC容器之后,将这些对象创建、管理、控制权都交给了ICO容器。由容器来完成对象的创建、组合。这样的话就不需要在主动调用的时候去创建对象的依赖,达到了使用与创建的解耦,并且方便了重复利用,使得整个的代码体系结构变的更加的灵活。

IOC所带来的并不是技术上的多大的改变,而是编程思想上的巨大变化。这样的变化极大的提升了程序的开发效率。所有的对象的创建依赖操作都是通过容器来进行,减少了开发者去查询创建对象依赖操作。

依赖注入ID是什么?

ID(Dependency Injection)依赖注入,在容器运行的过程中决定了组件与组件之间的依赖关系,也就是说容器动态的管理了对象的依赖关系。而依赖注入的目的并非是给程序带来更多的功能,而是为了提升组件的重复使用率,这样不同的组件可以在系统的不同位置被重复使用。通过依赖注入的方式,可以通过简单的几个小配置就可以完成指定组件的装配,完成定制化业务的开发。

为什么需要进行依赖?

在上面我们提到过对象的创建是由容器决定的,但是创建什么样的对象是由业务逻辑来决定的,所以说容器需要依赖外部的资源来决定提供什么样的对象。

谁依赖于谁?

根据上面的介绍,由于对象的创建是容器来管理,而使用对象则是应用程序来使用,所以是应用程序依赖于容器。

谁注入了谁?

显然,是往IOC容器中注入应用程序中某个使用的对象。

注入了什么?

应用程序要根据具体的业务来使用指定的对象,所以注入的应该是依赖了某些外部资源的对象,用来完成应用程序的某些业务场景。

IOC与DI的关系

由于控制反转的概念是一个程序设计思想,而依赖注入更像是一种具体的实现方式。所以说IOC是DI操作的核心思想而DI操作则是IOC思想的具体实现。