什么是依赖关系?

纵观所有的Java 应用,从基于Applet的小应用到多层次结构的企业级别的应用,他们都是一种典型的依赖性应用,也就是由一些互相协作的对象构成的,Spring把这种互相协作的关系称之为依赖关系,加入A组件调用了B组件的方法,我们可以理解为A组件依赖于B组件。

什么是依赖注入(控制反转)?

所谓依赖注入,就是指程序运行过程中,如果需要另一个对象协作(调用对象的方法,访问它的属性)时,无须在代码中创建被调用者,而是依赖外部容器的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。

简单理解就是:当某个Java实例(调用者)需要另一个Java实例(被调用者)时,在传统的程序设计过程中,通常有调用者来创建别调用者的实例,而在依赖注入的模式下,创建被调用者的工作不在有调用者来完成,因此称之为控制反转;创建被调用者的实例工作通常是由Spring容器来完成,然后动态注入给调用者,因此叫依赖注入;

举个简单的例子,比如一个男生想要找女朋友了,如果这个男生还在上大学呢,他会参加各种社团,比赛,晚会啊等等,不放过任何接触到妹子的机会,如果碰到喜欢的妹子了,主动的去打听妹子的电话,微博微信,QQ等妹子的联系方式,个人信息,可是如果这个男生已经工作了,而且还在挨踢公司(加班,加班,还是加班)工作,他就可能没有空余的时间找妹子了,怎么办呢,工作虽忙,女朋友还是要有的,各种征婚交友网站,网站自动给你推荐合适的女朋友。找妹子的工作就交个了网站,这个过程呢就叫控制反转,交友网站就相当于一个Spring容器,根据你填写的交友条件,给你推荐合适的人选。

Spring如何实现依赖注入?

    • 设值注入:IoC容器使用属性的Setter 方法来注入被依赖的实例。(该方式简单直观,在实际开发中用的比较多)

设值注入的过程----》》》

Spring会自动接管每个<bean../>定义的<property../>元素定义,Spring会在调用无参的构造器后,创建默认的Bean实例后,调用对应的setter方法为程序注入属性值,<property../>定义的属性值不再由Bean来主动设置,管理,而是接受Spring的注入(<property name="..." value="注入的值" >)。该方式不仅可以对普通的属性注入,而且Spirng也可以为目标Bean注入所依赖的Bean(<property name="..." ref="被依赖的Bean的id" >).

    • 构造注入:IoC容器使用构造器来注入被依赖的实例。

构造注入的过程----》》》

构造注入通过调用有参的构造器,当Bean实例创建完成后,已经完成了所依赖关系的注入(<constructor-arg ref="..."/>)。

两种注入方式的比较

    • 通过设值注入(setter方法注入)设定的依赖关系显得更加直观自然。
    • 创建所依赖的组件(Bean)的时机不同,设值注入是先通过无参的构造器创建一个Bean实例,然后调用对应的setter方法注入依赖关系,二构造注入是直接调用有参的构造器,当Bean实例创建完成后,已经完成了所依赖关系的注入。
    • 对于复杂的依赖关系,采用构造注入,会导致构造器臃肿,Spring在创建Bean实例时,需要将其依赖的组件全部实例化,因此可能导致性能下降,而使用设值注入,能够避免该问题。
    • 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。
    • 对于依赖关系无须变化的Bean,构造注入效果更好,因为没有setter方法,所有的依赖关系都在构造器中设置好,无须担心后续的代码修改对依赖关系产生破坏。

Spring 学习之依赖注入的更多相关文章

  1. Spring 学习笔记 ----依赖注入

    依赖注入 有三种方式,本文只学习下属性注入. 属性注入       属性注入即通过 setXxx方法()注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入方式是 ...

  2. Spring学习笔记--依赖注入

    依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...

  3. Spring学习(一)---依赖注入和控制反转

    Spring Spring是一个从实际开发中抽出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供 ...

  4. spring学习之依赖注入DI与控制反转IOC

    一 Ioc基础 1.什么是Ioc? Ioc(Inversion of Control)既控制反转,Ioc不是一种技术,而是一种思想,在Java开发中意味着将设计好的对象交给容器来进行控制,并不是像传统 ...

  5. spring学习 五 依赖注入的方式

    依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...

  6. Spring学习——DI(依赖注入)

    IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...

  7. Spring学习--泛型依赖注入

    暂时没有搞懂.

  8. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  9. Spring学习(一)——Spring中的依赖注入简介【转】

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

随机推荐

  1. Trees on the level UVA - 122 (二叉树的层次遍历)

    题目链接:https://vjudge.net/problem/UVA-122 题目大意:输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值.每个结点都按照从根节点到它的移动序列给出 ...

  2. linux信号的处理--部分源码分析

    基于linux master v4.9版本 信号是异步的, 一.信号何时来 信号是异步的,对于一个进程随时都会接收到信号. 二.选择线程(task)来处理 那么一个进程接收到信号时,需要选择一个tas ...

  3. mac os安装macvim

    1 brew install macvim 安装 macvim 2 alias vim='/usr/local/Cellar/macvim/7.4-73_1/MacVim.app/Contents/M ...

  4. HBuilder更换部分

    1.HBuilder工作空间的更换 HBuilder的默认工作空间的修改并不像其他ide一样,在设置里进行更改,而是在工具中进行设置. 1.单击菜单栏“工具”,选择“变更默认代码存放目录” 2.进行修 ...

  5. 移动Web开发与适配笔记

    项目要是适配手机端,想透彻的把相关内容弄清楚,现在总结一下. 一.移动端开发有如下特点: 1.跑在手机端的web 页面就是h5页面 2.具有跨平台性(web 安卓 iOS都适应) 3.基于webvie ...

  6. javascript 数组方法拼接html标签

    var htmls = new Array(); htmls.push("<tr class='otherinfotr'>");htmls.push("< ...

  7. JS匿名函数递归实现阶乘

    var rs = (function (value) { if (value > 1) return value * arguments.callee(value - 1); return va ...

  8. [转]javascript之数组操作

    javascript之数组操作 .数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个 ...

  9. js获取日期:前天、昨天、今天、明天、后天

    前天,昨天,今天,明天,后天 <html> <head> <meta http-equiv="Content-Type" content=" ...

  10. maven课程 项目管理利器-maven 3-5 maven生命周期和插件 4星

    本节重点: maven插件的使用 本节主要内容: 1 maven生命周期 2 maven插件的使用 3 零散知识点 1 maven生命周期  maven生命周期主要有三个: a clean 清理项目 ...