什么是依赖关系?

纵观所有的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. sqoop导出数据

    export是HDFS里的文件导出到RDBMS的工具,不能从hive.hbase导出数据,且HDFS文件只能是文本格式.如果要把hive表数据导出到RDBMS,可以先把hive表通过查询写入到一个临时 ...

  2. cannot focus element解决方案

    If you enconter error "cannot focus element" when using Selenium+Python in Chrome to input ...

  3. Spark RDD持久化说明

    以上说明出自林大贵老师关于Hadoop.spark书籍,如有兴趣请自行搜索购买! 这是我的GitHub分享的一些笔记:https://github.com/mahailuo/pyspark_notes

  4. httpd 的坑

    Httpd服务器的坑 在/etc/httpd/conf/httpd.conf中的配置信息, 有时注释到的内容仍然会生效 配置Auth时, 允许htpasswd规定的文件中的所有的用户, Require ...

  5. 微信小程序全选多选效果

    效果图: 代码: wxml <view class='hei_top'> <view class='hei_p'>共 <text>4</text> 场& ...

  6. IOS如何打越狱包xcode无证书打包ios应用

    本文要介绍的是在无证书的情况下如何将自己应用打包出去在越狱设备上使用或发给第三方使用企业签名进行应用分发. 前提条件:拥有appleId账号,并且该账号已经注册开发者中心(无需花钱) 教程开始: 1. ...

  7. 拼json对象批量向后台添加数据

    网站中如果遇到批量提交格式相同数据,可以使用json来传输 $("#catalogSave").click(function(){ var array=[]; $("[n ...

  8. html:option

    注意事项: (1):In HTML the <option> tag has no end tag.HTML中<option>标签不需要关闭.In XHTML the < ...

  9. Java中的阻塞队列-LinkedBlockingQueue(二)

    原文地址:http://benjaminwhx.com/2018/05/11/%E3%80%90%E7%BB%86%E8%B0%88Java%E5%B9%B6%E5%8F%91%E3%80%91%E8 ...

  10. 常用CSS样式设置

    文字 我们以div标签举例,来设置常见的文字样式 <div>今天天气真晴朗!</div> div { /* 文字大小为14像素 */ font-size: 14px; /* 文 ...