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

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. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  2. 建堆是 O(n) 的时间复杂度证明。

    建堆的复杂度先考虑满二叉树,和计算完全二叉树的建堆复杂度一样. 对满二叉树而言,第 \(i\) 层(根为第 \(0\) 层)有 \(2^i\) 个节点. 由于建堆过程自底向上,以交换作为主要操作,因此 ...

  3. 简约之美jodd--props属性使用

    Prop是一个超级properties:包含了很多jdk缺失的东西:utf-8支持,宏,分区,profiles,全配置等等. 属性存储在一个或者多个*.props文件,而且它是开放的,支持多种类型的资 ...

  4. Day4晚笔记

    数据结构 并查集:捆绑两个点的信息,判断对错 倍增:LCA, 字符串 hash,模拟, 最小表示法 给定一个环状字符串,切开,使得字符串的字典序最小 图和树 割点,割边,强联通分量 点双联通分量 (把 ...

  5. ASP.NET MVC使用Ninject

    Ninject是一个快如闪电的,轻量级的.....依赖注入框架,呃呃呃,貌似很少用到,Ninject就是一个DI容器,作用是对ASP.NET MVC程序中的组件进行解耦 ,说到解耦其实也有其他的方式可 ...

  6. C# winform利用反射和自定义特性加载功能模块(插件式开发)

    由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...

  7. shell脚本中的反引号,单引号,双引号与反斜杠

    转自:http://blog.sina.com.cn/s/blog_6561ca8c0102we2i.html 反引号位 (`)经常被忽略,而且容易与单引号弄混.它位于键盘的Tab键的上方.1键的左方 ...

  8. 例说linux内核与应用数据通信(一):加入一个系统调用

    [版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途]         应用不能訪问内核的内存空间.为了应用和内核交互信息,内核提供一 ...

  9. android开发-获取wifi列表

    近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...

  10. 利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类

    贝叶斯公式描写叙述的是一组条件概率之间相互转化的关系. 在机器学习中.贝叶斯公式能够应用在分类问题上. 这篇文章是基于自己的学习所整理.并利用一个垃圾邮件分类的样例来加深对于理论的理解. 这里我们来解 ...