大家安安,今天過得好嗎?
寫這篇主要是想複習自己的DI觀念
之後也會介紹 Dagger in Android 跟 Spring Boot銜接
那就 開始吧?
DI的英文是Dependency Injection,中文叫依賴注入
A:主要是要處理 耦合性過高 的問題,才方便修改和做單元測試
好處
1.低耦合
2.更清晰的意圖
3.可維護性提高
4.可測試性
舉個耦合性過高的例子
class A(){
  //...
  private Sring hello="";
  String hello(String hello){
    this.hello=hello;
    return "aacutty"+hello;
  }
} 
class B(){
  A aa=new A();
  aa.hello("wow");
}
因為是用new Class的方式,所以一旦A生產的方式有改變 && 需要替代掉A (不想用A)之類的,這樣B class內的方法也需要修改。
若是做單元測試,以Spring Boot為例,你若想測試單一Class卻不想測試到資料庫,但是Class 與資料庫緊緊耦合在一起(ex new)那就不能拆開來測試了
若做DI,則能輕鬆將原本依賴的真實物件替換為mock物件
如果要把A class 改成 C class,我們可以用interface的方式實現,
這樣就不會因為要修改所以改動大一堆邏輯
當要決定與誰耦合只需要改動setICU(new A())裡面的參數
如果要同時改動hello方法的參數,也可以直接改動interface ICA內傳入為甚麼
public interface ICA {
    public hello(String hello);
}
class A() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    return "aacutty"+hello;
  }
} 
class C() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    this.hello=hello;
    return "ccutty"+hello;
  }
} 
class B(){
 /*   A aa=new A();
  aa.hello("wow"); */
  private ICA ica;
   public void setICU(ICA ica) {
        this.ica = ica;
    }
    
    //決定跟誰耦合
  //  setICU(new A()) 
   // setICU(new C())
  
  ica.hello();
}
constructer 的方式就是在construter將所有需要依賴注入的東西傳進去
好處就是一次傳完,相較於set
不過如果是要傳很多東西還是用set比較好,因為又比較分離一點修改比較方便
public interface ICA {
    public hello(String hello);
}
class A() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    return "aacutty"+hello;
  }
} 
class C() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    this.hello=hello;
    return "ccutty"+hello;
  }
} 
class B(){
 private ICA ica;
    class B(ICA ica){
        this.ica=ica;
    }
}
然後Spring Boot 底層就是IOC容器,等於只要加一些他要求的就可以直接注入了!!
相較於Spring要在config (xml) 中修改更方便許多
Android 的話 , Dagger可以幫你不用每次都new一個東西,如果想要在不同Class中拿到同一個object ,除了用傳遞的方式也可以用Dagger,只要綁同一個Scope,Component拿到的就是同一個 (因為不用重new),也可以節省重new很多重複東西的功夫
這兩者一樣有DI的方便性,若是熟悉就會易修改易處理,Dagger也是用@annotation的方式,如果有錯誤在編譯時期就會報錯
大概是這樣,如果有說錯可以跟我說~
之後會分別介紹 Dagger && Spring Boot