Spring的一个重要原理就是IOC(Inverse Of Control),即控制反转。IOC就是一种将组件依赖关系的创建和管理置于程序外部的技术,在Spring中Bean组件的实例化和依赖关系的管理控制都由Spring容器负责,对象与对象之间的关系可以简单的理解为对象之间的依赖关系:在 类 A 需要类 B 的一个实例来进行某些操作时,比如在类 A 的方法中需要调用类 B 的方法来完成功能,叫做类 A 依赖于类 B。依赖注入(DI:Dependency Injection) :两个对象之间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式称为依赖注入 (DI) ,DI 是 IOC 的一种形式。IOC能够实现:你的类不会去查找或是实例化它们所依赖的类。控制恰好是反过来的,容器会设置这种依赖关系。使用 IoC 常常使代码更加简洁,并且为相互依赖的类提供一种很好的方法。

依赖注入的三种实现类型:构造器注入、Setter注入和接口注入。

1、构造器注入

依赖关系是通过类构造函数建立的,容器通过调用类的构造方法将其所需的依赖关系注入其中,例如在Spring的XML配置文件中,在构造Bean的时候使用<constructor-arg>元素来设置其依赖的对象。构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。

<bean id="sonnet29" class="lucien.Sonnet29" /><!-- 构造器注入 -->
<bean id="poeticDuke" class="lucien.PoeticJuggler"><constructor-arg value="15" /><constructor-arg ref="sonnet29" />
</bean>

2、Setter方法注入

JavaBean的属性通常都是私有的,拥有一组存取器即:setXXX()和getXXX(),Spring就是通过使用属性的set方法来实现setter注入的。对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造注入模式的构造函数也会相当庞大,而此时setter注入模式则更为简洁。

package lucien;public interface Instrument {public void play();
}
package lucien;public class Saxophone implements Instrument {@Overridepublic void play() {// TODO Auto-generated method stub
        System.out.println("Saxophone");}}
package lucien;public class Instrumentalist implements Performer {private String song;private Instrument instrument;public String getSong() {return song;}public void setSong(String song) {this.song = song;}public Instrument getInstrument() {return instrument;}public void setInstrument(Instrument instrument) {this.instrument = instrument;}@Overridepublic void perform() {// TODO Auto-generated method stub
        System.out.println("playing " + song + " : ");instrument.play();}}

对应的配置文件部分如下:

<bean id="saxophone" class="lucien.Saxophone"/>
<bean id="Tim" class="lucien.Instrumentalist">
  <property name="song" value="Jingle Bells"/>
  <property name="instrument" ref="saxophone"/>
</bean>

3、接口注入

在类中,对于依赖的接口,通过具体的实现类名,动态的加载并强制转换成其接口类型。接口注入不常用。

package lucien;public class Saxophone implements Instrument {@Overridepublic void play() {// TODO Auto-generated method stub
        System.out.println("Saxophone");}}
package lucien;public class Instrumentalist implements Performer {private String song;private Instrument instrument;public String getSong() {return song;}public void setSong(String song) {this.song = song;}@Overridepublic void perform() {// TODO Auto-generated method stub
        System.out.println("playing " + song + " : ");try {instrument = (Instrument) Class.forName("lucien.Saxophone").newInstance();} catch (Exception e) {// TODO Auto-generated catch block
            e.printStackTrace();}instrument.play();}}

Spring bean的三种注入方式相关推荐

  1. spring入门之Spring 常用的三种注入方式

    Spring 常用的三种注入方式 Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入. 一.通过构造方法注入 先简单 ...

  2. Spring Bean的三种配置方式

    目录 一.传统的XML配置方式 二.基于java注解的配置 三.基于类的Java Config 正文 Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java C ...

  3. Spring常用的三种注入方式

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入. 构造方法注入 先简单看一下测试项目的结构,用maven构建的,四个包 ...

  4. Spring bean的三种创建方式

    1.创建Spring工程 使用eclipse创建一个Spring工程,一个简单的方法就是先创建一个Java工程,然后将Spring的Jar包全部放入到工程里面即可开始编写基于Spring框架的程序.S ...

  5. Spring构造器的三种注入方式

    构造器注入:通过构造方法注入就相当于给构造方法的参数传值,构造注入的优势是通过构造强制依赖关系,使得实例化出的bean对象一定是完整的或者可以使用的. Salary类 public class Sal ...

  6. spring三种注入方式

    设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...

  7. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  8. Spring的三种注入方式(为什么推荐构造器注入?)

    Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...

  9. 扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...

最新文章

  1. YourSQLDba的翻译(十一)
  2. 云炬Android开发教程0 jdk下载与安装教程(小白)
  3. IplImage类型解释和举例
  4. sql判断字段是否为空
  5. html加载swf 进度条,教你用FLASH如何制作完整的loading
  6. django 1.8 官方文档翻译: 2-5-6 多数据库
  7. 英特尔CEO重申全球性芯片短缺需要数年才能解决
  8. 大数据之-Hadoop之HDFS的API操作_文件上传---大数据之hadoop工作笔记0056
  9. filename.whl is not supported wheel on this platform 部分第三方库无法安装的解决办法
  10. 欧姆龙plc OMRON SYSMAX CP1H-E 使用 CXONE_V4.60 连接和编程
  11. Project(10)——收货地址 - 设置默认
  12. mount: unknown filesystem type
  13. Adjoin the Networks Gym - 100781A
  14. python电影网络爬虫代码_Python爬虫——爬取豆瓣电影Top250代码实例
  15. 欢迎新同事入职演讲稿
  16. 团队组成五个基本要素_团队的5个基本构成要素(5P):目标、定位、计划、职权、人...
  17. Unity Shader - Predefined Shader preprocessor macros 着色器预处理宏
  18. Jetpack学习-5-Navigation简单使用
  19. 如何在 Web 浏览器中启用 Java?
  20. 手机软件游戏安装方法(详细图文教程)-windows mobile系统PPC也通用

热门文章

  1. 计算机打字自动换行怎么,Word文档一行才输入几个字就自动换行了如何解决
  2. 查看和终止 Oracle 连接会话以及正在执行的 SQL 语句
  3. 咖啡技能知识培训|咖啡冲煮有哪几个基础要素
  4. 台式计算机材质,台式电脑显示器购买的时候主要看哪些参数?
  5. padding规则介绍
  6. js bind 传参、_Node.js 在企业中的应用实践集锦
  7. 猪年生肖特展亮相上海科技馆
  8. html如果修改鼠标指针,改网页鼠标指针、改指定元素指针(2)——小白也能自绘指针...
  9. 恐鬼症服务器不显示怎么回事,恐鬼症steam9月28日更新内容一览
  10. 莫欺少年穷的底层逻辑