Spring使用 --- 基本概念(一):DI,依赖注入
本文讲述sprint基本概念之一: DI, 即依赖注入。
什么是依赖注入
说类A依赖于类B,最简单的例子是类A有一个类型为类B的成员变量。
依赖注入是指类A不用关心类B对象如何创建,它只知道有一个类B的对象,只需要使用就行了。 这样有几个好处:
- 可以很容易替换类B的对象,达到不同的效果
- 类A更容易测试。只需要创建一个类B的mock对象即可。
- 类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,依赖注入的更多相关文章
- [转载]Spring下IOC容器和DI(依赖注入) @Bean及@Autowired
Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配 bean是什么 bean在spring中可以理解为一个对象.理解这个对象需要换一种角度,即可将spring看做一门 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- Spring 04: IOC控制反转 + DI依赖注入
Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...
- Spring:(二)DI依赖注入方式
DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...
- 学习Spring IOC控制反转和DI依赖注入总结
30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...
- [Spring]IOC控制反转和DI依赖注入
从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...
- Spring:Spring-IOC容器、DI依赖注入简介
Spring容器到底是什么? 从概念上讲:Spring 容器是 Spring 框架的核心,是用来管理对象的.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁. 从具象化 ...
- 【转】跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入)
在继续下面的章节之前,我们要先说说大名鼎鼎的IoC和DI. 我们经常会听说IoC,也就是Inversion of Controller,控制反转.事实上,IoC并不是一个新鲜的概念,最早可能是在198 ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- spring(一) IOC 控制反转 、DI 依赖注入
IOC 控制反转:创建对象的方式 变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...
随机推荐
- Android源码浅析(一)——VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置
Android源码浅析(一)--VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置 最近地方工作,就是接触源码的东西了,所以好东西还是要分享,系列开了这 ...
- Leetcode_24_Swap Nodes in Pairs
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43302355 Given a linked list, s ...
- 【Java编程】Eclipse快捷键
Alt+左箭头,右箭头 以在编辑窗口切换标签 Alt+上下箭头, 以自动选择鼠标所在行,并将其上下移动 Ctrl+f6 ...
- 【Qt编程】Qt 小时钟
Hello World! 学习编程语言的最简单最经典的小程序,当然Qt也不例外.在学习画图时,我觉得写个时钟小程序也是个比较好的开始.在之前的<Matlab及Java小时>一文中,我也从写 ...
- Linux下简易线程池
线程池简介 线程池是可以用来在后台执行多个任务的线程集合. 这使主线程可以自由地异步执行其他任务.线程池通常用于服务器应用程序. 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会 ...
- Linux常用命令(第二版) --帮助命令
帮助命令 1.man[manual]: /usr/bin/man 获得命令或配置文件的帮助文档,优先查看命令的帮助 格式:man [命令或配置文件] #会同时调用more E.g. man ls # ...
- iOS中NSBundle的介绍
bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle,cocoa提供了类NSBund ...
- EBS R12安装升级(FRESH)(二)
3 Linux系统设置 这一节步骤基本都在终端root用户下进行. 自行熟悉vi或其他文本工具的用法. 3.1 host-only外网连接 如果用的NAT模式这一节略过. 右击当前主机连接外网的网卡, ...
- C语言之linux内核实现位数高低位互换
linux内核实在是博大精深,有很多优秀的算法,我之前在工作中就遇到过位数高低位交换的问题,那时候对于C语言还不是很熟练,想了很久才写出来.最近在看内核的时候看到有内核的工程师实现了这样的算法,和我之 ...
- Smali语法汇总(一)
Opcode 操作码(hex) Opcode name 操作码名称 Explanation 说明 Example 示例 00 nop 无操作 0000 - nop 01 move vx, vy 移动v ...