Spring控制反转(IoC)和依赖注入(DI)

下面通过实际生活中的一个例子来解释IoC和DI。

当人们需要一件东西时,第一反应就是找东西,例如想吃面包。在没有面包店和和有面包店两种情况下,会怎么做呢?

在没有面包店的情况下,直接做法就是,自己按照自己的口味制作面包,(也相当于程序员自己创建Java对象)。而在有面包店的情况下,把自己的需求告诉面包店,然后面包店给自己制作面包。注意,您并没有制作面包,而是由面包店制作,但符合需求。(相当于Spring IoC容器创建Java对象)。

上面只是列举了一个非常简单的例子,但包含了控制反转的思想,即将制作面包的控制权交给了面包店。(程序员->Spring IoC)

这里有人要问了,为什么要设计和使用控制反转?即IoC出现的背景。

当某个Java对象(调用者->自己)需要调用另一个Java对象(被调用者,即被依赖对象,面包)时,在传统编程模式下,调用者通常会采用“new 被调用者”的代码方式来创建对象(例如您自己制作面包)。这种方式会增加调用者与被调用者之间的耦合性(调用者对象中侵入或说new了依赖对象,耦合性较强),不利于后期代码的升级与维护。
那怎么解决这个问题呢?直接想到的方法是解耦,调用者与被调用者二者的相互独立(非侵入其他对象),但又有联系。进一步就是,调用者不new被调用者,但调用(引用)被调用者。那么问题来了,谁new被调用者,谁将被调用者注入(引用)到调用者?这里就说了,除了程序员new谁还有权利new?
这里就有人想出了IoC,这一聪明的idea。设计Spring IoC容器,创建对象的实例(这里指的是标记为Bean的对象,并非普通对象),而且会负责控制程序之间的关系,而不是程序员的程序直接控制。这就是Spring的控制反转。

从Spring容器角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。
综上所述,控制反转是一种通过描述(在Spring中可以是XML或注解)并通过第三方去产生或获取特定对象的方法。在Spring中实现控制反转的是IoC容器,其实现方法是 依赖注入。

猜你喜欢

转载自blog.csdn.net/chegy218/article/details/88396341