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方法.