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. ...
随机推荐
- spring aop 原理学习
@EnableAspectJAutoProxy: @Import(AspectJAutoProxyRegistrar.class) 实际是创建了一个以org.springframework.aop.c ...
- A. Yet Another Problem with Strings 分块 + hash
http://codeforces.com/gym/101138/problem/A 感觉有一种套路就是总长度 <= 某一个数的这类题,大多可以分块 首先把集合串按长度分块,对于每一个询问串, ...
- linux解压大全
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...
- 标准I/O库(详解)(Standard I/O Library)
文章转自:https://www.cnblogs.com/kingcat/archive/2012/05/09/2491847.html 自己在学习中,对此原文的基础之上进行补充. 什么是缓冲区 缓冲 ...
- POJ 1182——食物链——————【种类并查集】
食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status P ...
- Android JNI和NDK的关系
转自:http://blog.csdn.net/elfylin/article/details/6121466 1.什么JNI Java Native Interface(JNI)标准是java平台的 ...
- Unity C# 用枚举(enum)制作复选框
最近在项目中做测试脚本用到一些布尔值做方法的开关,突然想到可以制作一个复选框控制开关. 首先搜集网上的资料,基本大同小异,这里就不多做解释了,代码附上: public class EnumFlagsA ...
- mongodb 用户权限控制
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...
- ArrayList、Vector、HashMap、HashSet
1. list 和 set 的有序无序是否可重复 List是有序可重复的: Set是无序不可重复的: 2.ArrayList.Vector.HashMap.HashSet的默认初始容量.加载因子.扩 ...
- Python中的循环体
一.循环 1.while语句: while 条件: 循环体 else: 当上面的条件不成立时才会执行 执行顺序:判断条件是否为真.如果为真,执行循环体,再次判断条件如果为假,执行else下代码块 2. ...