一。什麼叫控制反轉
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企業應用開發實戰等相關書籍。