对spring控制反转以及依赖注入的理解

一、说到依赖注入(控制反转),先要理解什么是依赖。

Spring 把相互协作的关系称为依赖关系。假如 A
组件调用了 B
组件的方法,我们可称A
组件依赖于 B
组件

二、什么是依赖注入。

在传统的程序设计过程中,通常由调用者来创建被调用者的实例

在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring
容器来完成,然后注入给调用者,因此也称为依赖注入。

自己理解:即一句话,由spring容器来控制组件A的调用的具体对象B。组件A依赖于spring容器的注入。

三、依赖注入的好处。

不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。 (此方法依赖于接口)

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。

第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。

   延时加载:容器在

依赖注入让 Spring
的 Bean
以被指文件组织在一起,而不是以硬编码的方式耦合在一起程序完成无须理会被调用者的实现,也不无须主动定位工厂,这是最好的解耦方式实例之间的依赖关系由
IoC 容器负责管理

四、依赖注入的 Spring
实现

1、设值注入

设值注入是指 IoC
容器使用属性的 setting
方法来注入被依赖的实例。

先创建一个实体对象(Bean)

[java] view
plain
copy

1.     public class HelloWorld {

2.         private String msg;

3.

4.         public String getMsg() {

5.             return msg;

6.         }

7.         public void setMsg(String msg) {

8.             this.msg = msg;

9.         }

10.  }

再配置文件applicationContext.xml,实例化bean

[java] view
plain
copy

1.     <bean id="helloBean" class="com.spring.demo.HelloWorld">

2.            <property name="msg" value="Hello World!"/>

3.      </bean>

最后测试是否能够得到注入的bean,并打印出对象的属性。

[java] view
plain
copy

1.     public static void main(String[] args){

2.             //读取配置文件,获得BeanFactory

3.             ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

4.             BeanFactory factory = context;

5.

6.             HelloWorld hello = (HelloWorld)factory.getBean("hello");

7.

8.             System.out.println(hello.getMsg());

9.      }

2、构造注入

除了设值注入,还有另一种注入方式,这种方式在构造实例时,已为其完成了依赖关系的初始化。这种利用构造器来设置依赖关系的方式,被称为构造注入。

先创建一个实体对象(Bean)

[java] view
plain
copy

1.     public class HelloWorld {

2.         private String msg;

3.

4.         //需要一个默认无参构造器

5.         public HelloWorld(){}

6.

7.         public HelloWorld(String msg){

8.             this.msg = msg;

9.         }

10.

11.      public String getMsg() {

12.          return msg;

13.      }

14.      public void setMsg(String msg) {

15.          this.msg = msg;

16.      }

17.  }

再配置文件applicationContext.xml,实例化bean。

[java] view
plain
copy

1.     <bean id="hello" class="com.spring.demo.HelloWorld">

2.          <constructor-arg index="0">

3.                <value>HelloWorld!</value>

4.            </constructor-arg>

5.      </bean>

最后测试是否能够得到注入的bean,并打印出对象的属性。

[java] view
plain
copy

1.     public static void main(String[] args){

2.             //读取配置文件,获得BeanFactory

3.             ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

4.             BeanFactory factory = context;

5.

6.             HelloWorld hello = (HelloWorld)factory.getBean("hello");

7.

8.             System.out.println(hello.getMsg());

9.      }

五、处理bean依赖关系的步骤

1、根据定义bean的配置创建并初始化BeanFactory实例

2、每个bean的依赖将以属性、构造器参数、或静态工厂方法参数的形式出现。当这些bean被实际创建时,这些依赖也将会提供给该bean。

3、每个属性或构造器参数既可以是一个实际的值,也可以是对该容器中另一个bean的引用。

4、每个指定的属性或构造器参数值必须能够被转换成特定的格式或构造参数所需的类型。

Spring会在容器被创建时验证容器中每个bean的配置,包括验证那些bean所引用的属性是否指向一个有效的bean。在bean被实际创建之前,bean的属性并不会被设置。伴随着bean被实际创建,作为该bean的依赖bean以及依赖bean的依赖bean也将被创建和分配。

六、两种注入方式的对比

1、相比之下,设值注入具有如下的优点:

(1)、与传统的 JavaBean
的写法更相似,程序开发人员更容易理解、接受。通过 Setting方法设定依赖关系显得更加直观、自然。

(2)、对于复杂的依赖关系,如果采用构造注入,会导致构造过于臃肿,难以阅读。Spring
在创建 Bean
实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。

(3)、尤其是在某些属性可选的情况下,多参数的构造器更加笨重。

2、构造注入也不是绝对不如设值注入,在某些特定的场景下,构造注入比设值注入更优秀。构造注入也有如下优势:

(1)、构造注入可以在构造器中决定依赖关系的注入顺序,有限依赖的优先注入。例如,组件中某些其他依赖关系的注入,尝尝需要依赖于 Datasource
的注入。采用构造注入,可以在代码中清晰地决定注入顺序。

(2)、对于依赖关系无须变化的 Bean
,构造注入更有用处。因为没有 setting
方法,所有的依赖关系全部在构造器内设定。因此,无须担心后续代码对依赖关系产生的破坏。

(3)、依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完成透明,更符合高内聚的原则。

两种方式总结:建议采用以设值注入为住,构造注入为辅的注入策略。对于依赖关系无须变换的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设值注

时间: 2024-10-13 10:46:12

对spring控制反转以及依赖注入的理解的相关文章

Spring控制反转和依赖注入

(1)为什么使用控制反转和依赖注入 调用者不用去关心被调用者的实现,不需要调用者亲自创建被调用者的实例,这些操作都交给框架去完成. 这种设计思想就是控制反转(Inversion of Control, IoC),同时,它还有另外一个名字就是依赖注入(Dependency Injection, DI). (2)什么是控制反转和依赖注入 控制反转(IoC)是将由程序控制的"对象间的依赖关系"转交给IoC容器来进行控制,被调用者的实例创建工作不再由调用者来完 成.通过控制反转,可以实现由外部

控制反转和依赖注入的理解(通俗易懂)

转自:    https://blog.csdn.net/sinat_21843047/article/details/80297951 https://jinnianshilongnian.iteye.com/blog/1413846 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈

Spring控制反转与依赖注入(IOC、DI)

IOC: 反转控制   Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创建,对象依赖关系的组装,对象属性的初始化,程序员只需要在程序接收spring创建的对象即可. Object obj= new Object(); IOC :  Object obj;  等着接收spring容器创建好的对象,在程序中将对象的创建的权限交出,反转到spring容器中. DI:  某个对

java 控制反转和依赖注入的理解

开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~ 这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现,使用接口的引用调用的方法,永远不需要改变 举一个栗子: 写个接口,说咱们购物去~ public interface IShopping {

Spring 基础 控制反转和依赖注入

Spring框架两个最重要的知识点 1.IOC(控制反转)/DI(依赖注入):把整个项目中的所有对象交给Spring容器管理 IOC:取到对象 DI:对象的装配 依赖注入有两种方式: 1.      属性值注入方式 a.     普通类型 注入方式 b.bean注入方式 测试结果 在使用普通类型方式注入的时候,我们会有一些特殊字符,处理这种特殊字符时 我们会想使特殊字符保持原有的样子,这时候就要使用CDATA,就如上一张图片所示 2.构造参数注值方式 在一般情况,一个类会有一个默认的无参构造函数

spring(3)------控制反转(IOC)/依赖注入(DI)

一,spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理. 所谓的"控制反转"概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器. 没有控制反转这种模式前,你创建一个对象,在什么地方用,你得单独通过关键字new出来用, 但现在可以不用这样,你把new对象的权利交给spring配置文件,通过配置文件来'new', 就是权利的反转,你以前干的事

Spring框架之控制反转和依赖注入

学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权的转移: 就叫做控制反转. 第一步:配置applicationContextcreateproject.xml和applicationcontext.xml(总体) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=

spring学习总结一----控制反转与依赖注入

spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转(依赖注入)进行简单的总结. 一.控制反转与依赖注入的概念 在学习spring框架的时候,我们习惯性地将控制反转和依赖注入放在一起,其实,两者体现的思想原则都是差不多的,只不过控制反转是一种更广泛的程序操作理念,而依赖注入是一种更为具体的实现方法,总的来说,控制反转可以依靠依赖注入来实现. 1.控制

轻松了解Spring中的控制反转和依赖注入

我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级JavaBean(Enterprise JavaBean ,EJB)在创建之初是非常成功,但是时间一久人们便开始追逐更加方便更加简易和轻量级的技术框架实现,于是Spring就应运而生,并且Sring一直开始不断地涉及到其他领域(这里就不再多详谈了),而Spring的精髓当中就包括控制反转和依赖注入. 浅