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

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实现的主要原理:通过读取beanx.xml配置文件(有专门的工具类 elements),利用java的反射机制,生成相应的类对象(Object类型,然后能够用Object.getDeclaredMethods()来获取全部的方法名称。假设该方法名以set为开头,那么我们能够再读取配置文件里相应的属性,利用method.invoke()方法将属性注入到我们的对象其中。

   模拟实现方式能够參考一下博客

http://blog.csdn.net/it_man/article/details/4402245

四、依赖注入的 Spring实现

、设值注入

设值注入是指 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.      }

、构造注入

除了设值注入。还有还有一种注入方式,这样的方式在构造实例时,已为其完毕了依赖关系的初始化。

这样的利用构造器来设置依赖关系的方式,被称为构造注入。

先创建一个实体对象(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.   &nbsp

posted @ 2017-07-17 10:05 zhchoutai 阅读(...) 评论(...) 编辑 收藏

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

  1. spring 控制反转与依赖注入原理-学习笔记

    在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...

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

    IOC: 反转控制   Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...

  3. Spring控制反转(依赖注入)的最简单说明

    1.常规方式实现实例化 1.1已有角色如下: 一个接口Interface,两个接口实现类InstatnceA.InstanceB,一个调用类User 1.2当前实例化InstanceA如下: Inte ...

  4. Spring 控制反转和依赖注入

    控制反转的类型 控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项.通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL),这些子类型各自又可 ...

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

    开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的 ...

  6. Spring理论基础-控制反转和依赖注入

    第一次了解到控制反转(Inversion of Control)这个概念,是在学习Spring框架的时候.IOC和AOP作为Spring的两大特征,自然是要去好好学学的.而依赖注入(Dependenc ...

  7. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  8. 轻松了解Spring中的控制反转和依赖注入(一)

    我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...

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

    spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...

随机推荐

  1. ios学习之block初探

    1. block概念 block是ios4.0+和Mac osX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性.所谓匿名函数,也称闭包函数.即同意创建一个暂时的没有指定名称的函数. 最经经 ...

  2. Windows Embedded POSready2009

    Windows Embedded POSready2009 ,这个看上去和 XP 差不多,可能是别人说的 XPE 系统 下载 POSready2009_CD.iso, 安装 KEY :         ...

  3. thinkphp验证码(总结之后,效率非常好)

    thinkphp验证码(总结之后,效率非常好) 一.总结 1.总结:总结之后,效率非常好,复习的时候也才方便,也能深入到细处,非常方便建立熟悉感和突破使用困境 2.验证码使用中文集或者繁体集设置:这个 ...

  4. 2.Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)-

    转自:https://blog.csdn.net/a214919447/article/details/55260411 SOAP(Simple Object Access Protocol,简单对象 ...

  5. 笔记四:onsubmit和onclick的区别

    今天碰到关于表单提交的问题,我是用submit还是用onclick好呢,然后我去百度了一下两者的区别: onsubmit只能表单上使用,提交表单前会触发, onclick是按钮等控件使用, 用来触发点 ...

  6. 【Java学习】Font字体类的用法介绍

    一.Font类简介 Font类是用于设置图形用户界面上的字体样式的,包括字体类型(例如宋体.仿宋.Times New Roman等).字体风格(例如斜体字.加粗等).以及字号大小. 二.Font类的引 ...

  7. Keil 编译环境之在线仿真调试问题

    一.问题现象: 这几天刚开始上手STM32,使用Keil 环境进行编程,然后使用ULINK2进行在线仿真,在按键处理函数程序中设置断点,却发现按了按键程序没有停在设置的断点,程序正常运行,如下图所示, ...

  8. [Javascript AST] 4. Continue: Report ESLint error

    const disallowedMethods = ["log", "info", "warn", "error", & ...

  9. startActivity时报错Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag

    startActivity时报错Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVI ...

  10. 有关Canvas的一点小事--鼠标绘图

    1.  如何根据鼠标位置获取canvas上对应位置的x,y. 2.  canvas的图糊了,设置宽和高的方式不对. 3.鼠标绘图代码 之前听说过canvas这个元素,但是实际上并没有深入了解过.不过日 ...