深入理解spring容器中的控制反转(IOC)和依赖注入(DI)

什么是控制反转(IOC)?

“控制”就是指一件事物对另一件事物进行一种管理,而另一件事物处在一件事物的管理之下,这就叫控制。

在面向对象编程的时候,每一个程序的运行都是依赖于很多的对象, 这些对象一起相互协调工作才使得程序得以运行。而在编程早期主流框架还没有出现的时候,这些对象都是我们程序员new出来的。这样子就会出现很多问题,比如耦合度太强,不便于维护;每次运行程序的某个模块的时候可能都会去创建相应的对象(例如:servlet中的一个对象,如果使用new的方式创建的话,那么每次用户向这个servlet发送请求的时候都会去new这个对象。那么如果是很多用户访问的话,这个开销还是很大的),造成资源的浪费。

有了spring框架之后,这些对象创建的任务就交给了它,你想用的时候就找它要就OK。而这个对象是交给spring集中在一个地方去管理的,这样子的话耦合性就大大降低,而且便于维护(通俗点讲就是便于修改)。需要了就找它要。

“反转”指转向相反的方向。分析上边这两段话的话:创建对象其实就是一种“控制”,之前时候是程序员自己去new,这就叫做”正向“,程序员想在哪new就在哪new。而让spring去管理对象的时候,程序员不再有主动权了,变成了被动的伸手去要,相对于之前的“正向”现在完全反过来了。所以叫做“反转”

拿别人的言语来理解上边介绍的“控制反转”这个词(转载https://www.cnblogs.com/xxzhuang/p/5948902.html):在控制“正”转的情况下,在任何一个有请求作用的系统当中,至少需要有两个类互相配合工作,在一个入口类下使用new关键字创建另一个类的对象实例,这就好比在面向对象编程的思想下,“我“充当一个入口类,在这个入口类中,我每次吃饭的时候都要买一双一次性筷子(每一次使用都要new一次),在这样的关系下,是”我“(即调用者)每次都要”主动“去买一次性筷子(另一个类),我对筷子说你老老实实的过来我的手上。是我控制了筷子,在这种控制“正”转的关系下,放在现实生活当中,肯定是不现实的,更确切的做法是,买一双普通的筷子(非一次性),把他放在一个容器当中(在Spring中叫做IOC容器),你需要使用的时候就对容器说:IOC我想要用筷子(向容器发出请求),接着筷子就会”注入“到的手上,而在这个过程当中,你不再是控制方,反而演变成一名请求者(虽然本身还是调用者),依赖于容器给予你资源,控制权坐落到了容器身上,于是这就是人们俗称的控制反转

什么是依赖注入(DI)?

上边提到的“控制反转”是一种思想,侧重于原理,通过这种思想可以把对象创建出来;而依赖注入的话可以理解成是给创建出来的对象的属性赋值的过程,侧重于实现。

猜你喜欢

转载自blog.csdn.net/My_name_is_ZwZ/article/details/83216822