Spring 学习之依赖注入
什么是依赖关系?
纵观所有的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 学习之依赖注入的更多相关文章
- Spring 学习笔记 ----依赖注入
依赖注入 有三种方式,本文只学习下属性注入. 属性注入 属性注入即通过 setXxx方法()注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入方式是 ...
- Spring学习笔记--依赖注入
依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...
- Spring学习(一)---依赖注入和控制反转
Spring Spring是一个从实际开发中抽出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供 ...
- spring学习之依赖注入DI与控制反转IOC
一 Ioc基础 1.什么是Ioc? Ioc(Inversion of Control)既控制反转,Ioc不是一种技术,而是一种思想,在Java开发中意味着将设计好的对象交给容器来进行控制,并不是像传统 ...
- spring学习 五 依赖注入的方式
依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...
- Spring学习——DI(依赖注入)
IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...
- Spring学习--泛型依赖注入
暂时没有搞懂.
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
随机推荐
- mobiscroll 日期问题
做的一个项目中用到了mobiscroll日期控件,设置距离当前日期往前推一个月的时间出现如下图问题 弹出窗默认的年份不对,后来查找原因是初始化属性配置有问题,应该将设置为dateFormat:'yy- ...
- eclipse 分屏显示同一文件
某个类很大,可能有数千行.当你想要将类开头部分与中间或者靠后的部分进行对比时,请follow如下步骤: Window -> Editor -> Toggle Split Editor (C ...
- Kure讲HTML_HTML界面结构
1.HTML界面结构: 通常通过html开发的网页,它有一个自己固定的书写格式(类似于写信的时候也有固定的格式) <!-- DOCTYPE用来告诉浏览器用当前html文档是用html的哪个版本编 ...
- JavaScript比较运算符——"== != === !=="区别
JavaScript的比较和逻辑运算符用于测试 true 或 false. 比较运算符在逻辑语句中使用,以测定变量或值是否相等. 例如给定 x=5,下面的表格解释了比较运算符: 1. == 和===的 ...
- C语言实现通用链表初步(二)
接着上次的内容,我们继续! 还是无头单向非循环链表.假如要删除某个节点,如何实现? //删除成功返回0,失败返回-1 int slist_del(struct node_info *node, str ...
- jq回到顶部效果分析
在浏览网页时,超出屏幕高度就会出现提上点击回到顶部的图标,点击即可回到页面顶部. 用到的知识点如下: 1.首先控制图标的显示和隐藏,先要获取浏览器的高度. var wHeight = $(window ...
- 使用dtd--声明实体
1.预定义实体 符号 实体引用 < < > > & & ' ' " " 2.自定义实体 <!ENTITY addre ...
- uml的十三种图形
1.用例图:对系统的使用方式分类. 2.类图:显示类和它们的相互关系. 3.对象图:只显示对象及它们的相互关系. 4.活动图:显示人或对象的活动,其方式类似于流程图. 5.状态机图:显示生命周期比较有 ...
- #if #endif #elif #undef
#define aaa //放在代码最前面 int a = 1; a = a + 1; #if !aaa {a = a + 1;}#elif !aaaaa {a=a+11;}#en ...
- js的垃圾收集机制以及写代码如何处理
程序都自己的内存,一旦内存过多就会清楚以前的缓存.所以,在写代码的时候,不要仅仅只会推变量到栈中,还要会将变量从栈中释放. 那么问题来了,我们应该如何将内存从栈中释放呢? 要释放变量,那就要从java ...