从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。
Spring 支持构造函数注入和属性注入。下面我们继续使用以上的例子说明这三种注入方法
的区别。
1. 构造函数注入
在构造函数注入中,我们通过调用类的构造函数,将接口实现类通过构造函数变量传
入,如代码清单3-3 所示:
代码清单 3-3 MoAttack:通过构造函数注入革离扮演者
public class MoAttack { //此类表示剧本
private GeLi geli;
//①注入革离的具体扮演者
public MoAttack(GeLi geli){
this.geli = geli;
}
public void cityGateAsk(){
geli.responseAsk("墨者革离!");
}
}
MoAttack 的构造函数不关心具体是谁扮演革离这个角色,只要在①处传入的扮演者按
剧本要求完成相应的表演即可。角色的具体扮演者由导演来安排,如代码清单3-4 所示:
代码清单 3-4 Director:通过构造函数注入革离扮演者
public class Director {
public void direct(){
//①指定角色的扮演者
GeLi geli = new LiuDeHua();
//②注入具体扮演者到剧本中
MoAttack moAttack = new MoAttack(geli);
moAttack.cityGateAsk();
}
}
在①处,导演安排刘德华饰演革离的角色,并在②处,将刘德华“注入”到墨攻的剧
本中,然后开始“城门叩问”剧情的演出工作。
2. 属性注入
有时,导演会发现,虽然革离是影片《墨攻》的第一主角,但并非每个场景都需要革
离的出现,在这种情况下通过构造函数注入并不妥当,这时可以考虑使用属性注入。属性
注入可以有选择地通过Setter 方法完成调用类所需依赖的注入,更加灵活方便:
代码清单 3-5 MoAttack:通过Setter 方法注入革离扮演者
public class MoAttack {
private GeLi geli;
//①属性注入方法
public void setGeli(GeLi geli) {
this.geli = geli;
}
public void cityGateAsk() {
geli.responseAsk("墨者革离");
}
}
MoAttack 在①处为geli 属性提供一个Setter 方法,以便让导演在需要时注入geli 的具
体扮演者。
代码清单 3-6 Director:通过Setter 方法注入革离扮演者
public class Director {
public void direct(){
GeLi geli = new LiuDeHua();
MoAttack moAttack = new MoAttack();
//①调用属性Setter方法注入
moAttack.setGeli(geli);
moAttack.cityGateAsk();
}
}
和通过构造函数注入革离扮演者不同,在实例化MoAttack 剧本时,并未指定任何扮
演者,而是在实例化MoAttack 后,在需要革离出场时,才调用其setGeli()方法注入扮演者。
按照类似的方式,我们还可以分别为剧本中其他诸如梁王、巷淹中等角色提供注入的Setter
方法,这样,导演就可以根据所拍剧段的不同,注入相应的角色了。
3. 接口注入
将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的
注入方法。为了采取接口注入的方式,必须先声明一个ActorArrangable 接口:
public interface ActorArrangable {
void injectGeli(GeLi geli);
}
然后,MoAttack 实现ActorArrangable 接口提供具体的实现:
代码清单 3-7 MoAttack:通过接口方法注入革离扮演者
public class MoAttack implements ActorArrangable {
private GeLi geli;
//①实现接口方法
public void injectGeli (GeLi geli) {
this.geli = geli;
}
public void cityGateAsk() {
geli.responseAsk("墨者革离");
}
}
Director 通过ActorArrangable 的injectGeli()方法完成扮演者的注入工作。
代码清单 3-8 Director:通过接口方法注入革离扮演者
public class Director {
public void direct(){
GeLi geli = new LiuDeHua();
MoAttack moAttack = new MoAttack();
moAttack. injectGeli (geli);
moAttack.cityGateAsk();
}
}
由于通过接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注
入并无本质区别,因此我们不提倡采用这种方式。
分享到:
相关推荐
Spring IOC 控制反转简单过程 1: 导入需要报 2:构建spring的配合文件 3: 将我们创建的类交给spring容器管理 4: 实例化容器 5: 从容器中获取实例
spring IOC控制反转 spring IOC控制反转 spring IOC控制反转
spring ioc控制反转简单测试代码
springIOC 小例子 附带源码 适合新手学习
在Spring中使用Ioc控制反转,里面的底层实现原理,以及实现过程~
Java仿Spring框架IOC控制反转利用反射简单实现(源码) Java仿Spring框架IOC控制反转利用反射简单实现(源码)
Spring框架IoC控制反转
spring技术--IOC控制反转课件.ppt
NULL 博文链接:https://2594082lhj.iteye.com/blog/1694629
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合
spring ioc控制反转demo包含两种实现方式
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找...
学习Spring前比较又用的一个SPring基础框架
IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。... 在Spring中实现控制反转的是IOC容器 ,其 实现方法是依赖注入 (Dependency Injection,DI)
Spring.NET 控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理...
Spring核心学习IOC部分:从最简单的BeanFactory开始一步步完善类似Spring的功能
Spring IOC原理,类的继承关系,依赖注入和控制反转等关系
web开发技术spring框架控制反转思想IOC学习笔记,并对java的静态代理和动态代理进行了相关叙述
Spring框架学习中的核心,控制反转IOC,理解Spring框架主要注入所依赖的资源,解耦开发