IoC(Inverse of Contrlo)的字面意思是控制反转,“控制”是指某一接口的具体实现类的选择控制权,“反转”是指 这种控制权从调用类中移除,转交给了第三方(容器或者协作类)决定,因为IoC的名字起得不够开门见山,所以又提出了DI(依赖注入:Dependency Injection)的概念来替代 IoC,从注入方法看,这要有三种类型:
① 构造函数注入
public class MoAttack {
private GeLi geli;
//①注入革离的具体扮演者
public MoAttack(GeLi geli){
this.geli = geli;
}
public void cityGateAsk(){
geli.responseAsk("墨者革离!");
}
}
MoAttack 的构造函数不关心具体是谁扮演革离这个角色,只需要在①处传入的相应的对象即可。
public class Director {
public void direct(){
//①指定角色的扮演者
GeLi geli = new LiuDeHua();
//②注入具体扮演者到剧本中
MoAttack moAttack = new MoAttack(geli);
moAttack.cityGateAsk();
}
}
② 属性注入
构造函数注入的时候都需要先实例化geli,但有时候不需要实例化geli,而属性注入可以有选择的通过setter方法来完成调用类所需依赖的注入,更加灵活方便:
public class MoAttack {
private GeLi geli;
//①属性注入方法
public void setGeli(Geli geli){
this.geli = geli;
}
public void cityGateAsk(){
geli.responseAsk("墨者革离!");
}
}
public class Director {
public void direct(){
//①指定角色的扮演者
GeLi geli = new LiuDeHua();
MoAttack moAttack = new MoAttack();
//②调用属性setter方法注入
moAttack.setGeli(geli);
moAttack.cityGateAsk();
}
}
③ 接口注入
需要额外声明一个接口,不提倡
注: Spring尽量采用构造函数注入和属性注入(推荐)。