前言
一直使用springMVC做平臺開發(fā)突诬,沒有了解過內(nèi)部機制载矿,對“面向切面”和“依賴注入”也只是聽過名字而已围肥;近期開始研讀spring in action,對spring產(chǎn)生了新的理解〉I瘢現(xiàn)將自己的體會總結(jié)下來,此為第一篇始花。
正文開始
依賴注入
依賴注入用白話來解釋就是:以注入的方式來解決依賴導致的高耦合問題妄讯。
在任何一個應用中,都會有多個類組成酷宵,這些類相互之間進行合作來完成業(yè)務邏輯亥贸。如果按照傳統(tǒng)的做法,一個對象都要管理其所依賴的對象的引用浇垦,這將會導致高耦合也不利于功能擴展炕置。舉個例子:
public class Robat{
private Training training ;
public Robat (){
this.training = new ReadingTraining();//Robat 與 training類高耦合
}
public practise(){
this.training.practise();
}
}
我們定義了一個機器人類,這個機器人需要訓練男韧,而訓練的方法來自于閱讀訓練這個類中的practice函數(shù)朴摊。因此,可以看出此虑,robat類依賴于Readingtraining類甚纲。導致如果機器人需要訓練別的項目,那么需要我們更改代碼或者重寫寡壮,產(chǎn)生很多重復的邏輯贩疙。因此spring將這種依賴關系進行轉(zhuǎn)移,不再硬編碼般的寫入到依賴的類中况既,而是將其依賴關系交給目標對象这溅,讓目標對象去定義依賴關系;在依賴對象中棒仍,只去定義一個接口悲靴。具體代碼如下:
public interface Training (){
public void practice();
}
public class ReadingTraining implement Training(){
@Override
public void practice(){
print("this is read practice")
}
}
public class Robat{
private Training training;
public Robat (Training training){
this.training = trianing;//構(gòu)造器注入,training類被注入進來 }
public practise(){
this.training.practise();
}
}
上面莫其,我們定義了一個training的接口癞尚,因此,我們可以任意更改注入的東西乱陡,只要注入的類實現(xiàn)了training接口浇揩,使系統(tǒng)具有很高的擴展性。
依賴注入的三種實現(xiàn)方式
1憨颠、構(gòu)造函數(shù)注入
這是最簡單的注入方式胳徽,上面代碼所使用的就是構(gòu)造函數(shù)注入积锅。
2、setter注入
同樣我們也可以使用set函數(shù)進行依賴的注入:
public class Robat{
private Training training;
public void setTraining(Training train){
this.training = train;
}
public practise(){
this.training.practise();
}
}
3养盗、接口注入
接口注入首先需要定義一個接口,接口中定義注入方法缚陷,讓依賴類實現(xiàn)這個接口⊥耍看代碼
public interface injectRobat(){
public void inject(Training training);
}
public class Robat implement injectRobat{
private Training training;
@Override
public void inject(Taining training){
this.training = training;
}
public practise(){
this.training.practise();
}
}