dagger2從不懂到入門

dagger的目的是實現依賴注入ide

一、什麼是依賴注入函數

舉例:ui

不是依賴注入的例子:spa

class Person{對象

  void playGame(){接口

    Football football = new Football;開發

    football.play();get

  }編譯

}class

是依賴注入的例子:

class Person{

  void playGame(Football football){

    football.play();

  }

}

二、爲何須要dagger

其實你能夠不須要它,你手動按照上述方式注入也是能夠的。但若是你不想手動,並且想實現依賴注入並且不用寫不少的代碼就能正確的實現它,那你須要dagger。

3.我該如何使用dagger

首先你要對依賴注入這四個字有更深刻的理解。

既然想經過依賴注入來完成你的開發,因此你應當知道它主要就是兩點。

a.依賴從哪裏來

b.我將如何注入(設置、傳給)進去

一般的,依賴來自於new XXX(),並且注入的方式是構造函數(Person(String name))或直接設置(Person.name)。

因此dagger也不可避免的須要實現這兩點,爲了達到機器代替人工的目的,以及良好的拓展,

而做爲開發者只須要 寫接口 加註解 便可。

首先,dagger給咱們提供了兩種方式來實現依賴從哪裏來,

1.在須要被注入的類的構造函數中加上@Inject註解

或2.實現一個Module類,在類上面加上@Module註解,而且,須要提供若干個返回須要被注入的類的方法,這些方法都要加上@Provider註解

舉例說明:

public class Child{

  @Inject

  public Child(){

  }

}

 

@Module

public class MyModule{
  

  @Provider

  public Parent providerParent(){

    return new Parent();

  }
}

而後,爲了將這些須要被注入的類注入進入,須要作如下工做:

1.建立一個抽象類或接口 註解爲@Compoment,而且須要在註解的參數里加上可以提供須要注入的Module類的名稱。

2.對須要注入的類A的構造函數或成員加上@Inject註解,注意若是是在成員上加的,須要注意在Compoment接口或抽象類中添加一個方法,這個方法的參數只有一個,就是A。

舉例說明:

@Compoment(module={MyModule.class})

public interface MyComponent{

  

}

 

public class Family{

  @Inject Child child;

  @Inject

  public Family(Parent parent)

}

 

最後,在編譯期,dagger會爲咱們生成多個類,其中有一個針對Component類的實現DaggerCompoment,

咱們須要在恰當的時候(應是趁早)使用它,

使用方式大概是DaggerComponent.builder().xxxx.build();若是裏面有方法可能還須要加上injectxxx()。

舉例說明:
爲了實現child 注入到Family咱們須要在MyComponent補充一個方法:

@Compoment(module={MyModule.class})

public interface MyComponent{

  public void injectToFamily(Family family);

}

而後編譯完成後,會自動生成DaggerMyComponent實現類

而後在想使用Family以前,切記須要調用

DaggerMyComonent.builder().build().injectToFamily(???)

困難出現了,咱們沒有辦法直接建立Family的實例,由於咱們想經過dagger獲取,

爲了獲取到Family實例,須要在MyCompoment再添加一個方法

@Compoment(module={MyModule.class})

public interface MyComponent{

  public void injectToFamily(Family family);

  public Family getFamily();

}

這樣的話

MyComponent compoment = DaggerMyComonent.builder().myModule(new MyModule())build();

family = compoment.getFamily();
compoment.injectToFamily(family);

塵埃落定。

 

4.爲何這樣能夠實現依賴注入

dagger的作法是統一規範,建立與注入隔離;

首先在dagger中,一切被注入的對象的獲取都是從Provicer<T> 接口的get方法中來.

爲了實現這種統一的效果,dagger給每一個這種對象的獲取都創建了單獨的工廠類,

經過@Inejct構造器來提供對象的---->Person_Facatory

看一下它是如何實現的:

public final class Person_Factory implements Factory<Person> {
private static final Person_Factory INSTANCE = new Person_Factory();

@Override
public Person get() {
return new Person();
}

public static Factory<Person> create() {
return INSTANCE;
}

/** Proxies {@link Person#Person()}. */
public static Person newPerson() {
return new Person();
}
}

注意 :

public interface Factory<T> extends Provider<T> {
}

在須要的地方調用
Person_Factory.create().get()便可

若是對象獲取來自於Module,
dagger爲每一個在Module裏的方法都增長了工程類
譬如 MyModule_getPersonFactory,二者套路差很少.

而後注入的過程發生在被注入對象的實例獲取時(大部分);

MyComponent compoment = DaggerMyComonent.builder().myModule(new MyModule())build();

family = compoment.getFamily();//在getFamily調用的時候所依賴額對象也在完成建立。

而實現的思路也是先獲取到建立Family的工廠,而後調用它的get方法.

相關文章
相關標籤/搜索