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. ...
随机推荐
- [转]AngularJS+UI Router(1) 多步表单
本文转自:https://www.zybuluo.com/dreamapplehappy/note/54448 多步表单的实现 在线demo演示地址https://rawgit.com/dream ...
- rails4 ckeditor 的部署以及 中文化
首先ckeditor 要基于paperclip 之后paperclip 需要你在linux 下安装 ImageMagick 具体安装可参考http://my.eoe.cn/guanmac/arc ...
- 解决MyEclipse报errors running builder ‘javascript validator’ on project
今天导入项目的时候,报了以下错误 MyEclipse测到功能代码变化(保存动作触发)就报错: errors running builder ‘javascript validator’ on proj ...
- js面向对象之属性
1.属性的设置和获取,方式有两种: .和[ ] .是取自身属性 [ ]可以是变量 var obj={}; obj.name="sonia"; obj['age']=22 ...
- Dubbo分布式日志追踪
使用dubbo分布式框架进行微服务的开发,一个大系统往往会被拆分成很多不同的子系统,并且子系统还会部署多台机器,当其中一个系统出问题了,查看日志十分麻烦. 所以需要一个固定的流程ID和机器ip地址等来 ...
- Redis数据类型之散列类型hash
在redis中用的最多的就是hash和string类型. 问题 假设有User对象以JSON序列化的形式存储到redis中, User对象有id.username.password.age.name等 ...
- webpack打包将配置文件单独抽离不压缩打包
webpack.config.js: plugins: [ //提取公共模块 new webpack.optimize.CommonsChunkPlugin({ name: 'vendors', ch ...
- 移动端absolute元素居中
<div class="db"> <div class="dm"></div> </div> .db{ widt ...
- ArcGIS创建要素类
在使用ARCGIS软件进行工作时,免不了要建立地理数据库和要素类之类的.一下是我创建文件地理数据库并在数据库中创建要素类写相关步骤: 1.启动软件,可以使用ARCCatalog直接进行创建也可以使用A ...
- css3骰子(transform初识)
利用css3制作可旋转的骰子,效果图如下,也可以查看 demo: 首先是骰子的html结构,.page 是骰子的六个页面的 class,#one-#six分别表示六个面,.point 是骰子表面的点数 ...