一。什么叫控制反转
MoAttack 墨攻剧本需要一个英雄,去喊话,“墨者革离”。这时候剧本就控制LiuDeHua(刘德华)去喊话。
这个演员不一定确定是刘德华,我们可能找其他人来喊话,但是这个人必须有一个功能喊话。所以我们定义了一个角色接口(GeLi)演员实现这个接口。
我们需要实现剧本只是依赖角色。而不依赖演员。这个时候我们引入一个新的对象。导演
public MoAttack{
private Geli geli;
public void setGeli(Geli geli){
this.geli = geli;
}
public void cityGateAsk(){
geli.responseAsk("墨者革离");
}
}
----------
public interface GeLi{
void responseAsk();
}
public Class LiuDeHua{
public void responseAsk(){
system.out.println("墨者革离");
}
}
public Class Director{
public static void main(string[] args){
GeLi geli= new LiuDeHua();
Moattack moattack = new Moattack();
Moattack.setGeLi(geli);
Moattack.cityGateAsk();
}
}
这样就讲剧本和刘德华解耦了。可以安排不同的人来出演。
控制反转的含义:某一接口具体实现类的选择控制权,从调用类中移除,转交给第三方决定. 控制反转后来也叫依赖注入, 依赖注入:调用类对某一接口实现类的依赖关系有第三方(容器或者协助类)注入。
IOC依赖注入有三种方式。
- 构造函数注入
- 属性注入
- 接口注入
public MoAttack{
private Geli geli;
// public void setGeli(Geli geli){
// this.geli = geli;
// }
public MoAttack(GeLi geli){
this.geli = geli;
}
public void cityGateAsk(){
geli.responseAsk("墨者革离");
}
}
以上就是构造函数依赖注入,和属性方法依赖注入的对比。
对于接口注入它的效果和属性注入无本质区别,有点多次一举的意思。
以上是协助类注入,还是自己写代码。但是我们的角色,导游可能都是海选的,即角色不是由导演选择,三者解耦。这时候就要用到容器了
spring就是这样的一个容器。它通过配置文件或者注解描述类与类之间的依赖关系,自动完成类的初始化和依赖注入的工作。
先实例化,然后依赖注入。
以上知识参考:精通spring4.x企业应用开发实战等相关书籍。