本文讲述sprint基本概念之一: DI, 即依赖注入。

什么是依赖注入

说类A依赖于类B,最简单的例子是类A有一个类型为类B的成员变量。

依赖注入是指类A不用关心类B对象如何创建,它只知道有一个类B的对象,只需要使用就行了。 这样有几个好处:

  1. 可以很容易替换类B的对象,达到不同的效果
  2. 类A更容易测试。只需要创建一个类B的mock对象即可。
  3. 类A与类B解藕

不使用依赖注入时,类A负责创建类B的对象,写法如下:

class A {
B b;
A (){
// 此处A创建一个B的对象,作为自己的成员变量
b = new B();
}
void foo(){
b.bar();
}
} class B {
void bar(){
System.out.println("B bar");
}
}

其中创建类B对象的代码写死在类A的定义中,很码很僵化。如果想使用B的一个子类对象,除了修改类A的代码,别无它法。

一种更好的方法是通过构造器传入类B的对象,代码如下:

class A {
B b;
A (B b){
this.b = b;
}
void foo(){
b.bar();
}
}
// B的定义不变

这种方法也叫构造器注入。此时代码灵活了很多。此时类A的代码可以处理所有类B的子类。一般将B定义为接口,实际传入的是一个实现。这也是面向接口编程的一个例子。

Sprint中对于依赖注入实现的效果与构造器注入大致相同,只不过使用xml配置文件来完成将类B的对象装配给类A的对象。依赖注入主要维护对象之前的依赖关系,对象的创建。如果对象a依赖于另一个对象b,则Spring创建对象a时,根据事先定义的依赖规则(一般写在xml文件中),会先创建一个对象b,然后再创建对象a,最后将b装配给对象a。装配的意思是赋值,一般通过调用setter函数。

怎样使用

仍然采用上面的例子,类A,类B的定义如下:

class A {
B b;
A (B b){
this.b = b;
}
void foo(){
b.bar();
}
}
class B {
void bar(){
}
}

再创建一个xml文件,指定类A、B的依赖关系:

<beans>
<bean id="a" class="A">
<constructor-arg ref="b"/>
</bean>
<bean id="b" class="B">
</bean>
</beans>

最后在主代码中调用ApplicationContext.getBean("a")函数来获取类A的一个实例:

import org.springframework.context.support.ClassPathXmlApplicationContext;
class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("a.xml");
A a = context.getBean("a");
a.foo();
context.close();
}
}

其中ApplicationContext是bean的container,bean是一个符合一定要求的java类。

什么时候使用

只要是有对象依赖的情况下,都可以使用依赖注入来将类之前的依赖也类对象的创建这部分从核心代码里剥离出来,通过srping来管理及实现。感觉实际上是软件模块、组件更细的划分。

任何稍大一些的软件都是由多个类组成,这些类协同共同完成功能(通过组合的方式)。因此在绝大多数项目中都需要使用。

好处

  • 对象之间解藕
  • 可能方便的更改使用哪个依赖对象,只需要修改配置文件就行了
  • 类的测试会方便很多,只要为所有依赖的类创建mock对象即可

Spring使用 --- 基本概念(一):DI,依赖注入的更多相关文章

  1. [转载]Spring下IOC容器和DI(依赖注入) @Bean及@Autowired

    Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配 bean是什么 bean在spring中可以理解为一个对象.理解这个对象需要换一种角度,即可将spring看做一门 ...

  2. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  3. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  4. Spring:(二)DI依赖注入方式

    DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...

  5. 学习Spring IOC控制反转和DI依赖注入总结

    30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...

  6. [Spring]IOC控制反转和DI依赖注入

    从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...

  7. Spring:Spring-IOC容器、DI依赖注入简介

    Spring容器到底是什么? 从概念上讲:Spring 容器是 Spring 框架的核心,是用来管理对象的.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁. 从具象化 ...

  8. 【转】跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入)

    在继续下面的章节之前,我们要先说说大名鼎鼎的IoC和DI. 我们经常会听说IoC,也就是Inversion of Controller,控制反转.事实上,IoC并不是一个新鲜的概念,最早可能是在198 ...

  9. 三大框架 之 Spring(IOC控制反转、DI依赖注入)

    目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...

  10. spring(一) IOC 控制反转 、DI 依赖注入

    IOC 控制反转:创建对象的方式  变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...

随机推荐

  1. java,http的post和get

    使用Java发送GET.POST请求 --节选自<疯狂Java讲义>    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 UR ...

  2. Mac下ImageMagick安装(libpng)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/42562705 ...

  3. mysql进阶(十二)常见错误汇总

    原因:外键名不能重复

  4. android开发性能分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  5. TrueType字体的后缀名解释

    OpenType标准定义了OpenType文件名称的后缀名.包含TureType字体的OpenType文件后缀名为.ttf,包含PostScript字体的文件后缀名为.OTF.如果是包含一系列True ...

  6. 第一个Polymer应用 - (0)准备工作

    原文链接:  Getting Started - Your first Polymer application翻译时间: 2014年7月5日翻译人员: 铁锚 关于Polymer 的简介,请参考 CSD ...

  7. STM32之使用库函数驱动LED灯

    一.熟悉GPIO结构体 以下这个结构体是我从官方手册中获取的: typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMod ...

  8. LeetCode(67)-Rotate Array

    题目: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ar ...

  9. The 13th tip of DB Query Analyzer, powerful processing EXCEL file

    The 13thtip of DB Query Analyzer, powerful processing EXCEL file MA Genfeng (Guangdong UnitollServic ...

  10. AngularJs 指令directive之require

    controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编 写,使用起来比较简单:另一种方法则是require An ...