當(dāng)你在創(chuàng)建一個類實例的時候需要其他的支持類實例的支持時骂澄,你可以選擇new一個實例傳入吓蘑,當(dāng)然你也可以選擇依賴注入來簡化你的代碼。舉個最簡單的例子:
public class Cooker{
private CookTool tool坟冲;
public Cooker(CookTool tool){
this.tool= tool;
}
}
顯然磨镶,當(dāng)你想創(chuàng)建一個Cooker類時,你需要CookTool類實例的支持健提,于是你會用new Cooker(new CookTool());這樣的方式來創(chuàng)建Cooker類實例琳猫。但是如果這樣的類似的情況以及創(chuàng)建的類實例的數(shù)量相當(dāng)多的時候就會讓你感到頭疼了,因為這就是寫重復(fù)的代碼私痹。而dagger2就是你的救星脐嫂,它可以在你的合理配置下,幫你自動生動這些代碼紊遵。
經(jīng)過一段時間的了解账千,個人認為dagger2最主要的三個成分是@Inject注解、Component癞蚕、Module蕊爵。@Inject注解用于標記你需要依賴注入的類實例以及該類實例對應(yīng)的構(gòu)造方法,如上述的father桦山。Module的主要功能在于當(dāng)你需要第三方庫里面的類實例時攒射,由于你無法在源碼里面添加@Inject注解醋旦,所以你可以在Module里面先獲取第三方庫的類實例,然后再提供出去(需要@Provides注解)会放,當(dāng)然非第三方庫類你也可以再Module里面創(chuàng)建然后再提供出去饲齐。而對于Component,我們可以形象地將它稱為注射器咧最,它負責(zé)把@Inject和Module提供的類實例注射到你想到的地方捂人。還是上述的例子,假設(shè)我們要把Cooker注入到一個Activity:
第一步:
public class Cooker{
@Inject ??//標記要注入的地方
CookTool tool矢沿;(依賴注入的類不支持private)
@Inject ??//我們需要在Activity里注入Cooker實例
public Cooker(CookTool tool){
this.tool = tool;
}
//測試方法
public String makeFood(String msg){
Log.e("cook","I use "+msg);
}
}
public class CookTool{
@Inject ?//標記對應(yīng)的類構(gòu)造器
public CookTool(){
}
}
上述是dagger2依賴注入的第一種代碼實現(xiàn)滥搭,也就是用@Inject注解,第二種是用Module:
@Module ?//新建一個Module類捣鲸,記住要用@Module注解
public class BaseActivityModule{
//Module的構(gòu)造器
public BaseActivityModule(){
}
@Provides ?//提供注解
Cooker getCooker(){ ?//方法名隨意瑟匆,類型必須正確
return new Cooker(new CookTool());
}
}
第二步,創(chuàng)建Component:
@Sington @Component ?//返回單例栽惶,記得用@Component注解
(modules= {BaseActivityModule.class}) ?//將需要的Module包含進來
public class BaseActivityComponent{
void inject(BaseActivity baseActivity) //注射到BaseActivity
}
第三步,依賴注入:
public BaseActivity extends AppCompatActivity{
BaseActivityComponent component;
@Inject
Cooker cooker愁溜;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
//DaggerBaseActivityComponent是自動生成的,rebuild project之后可以查看外厂,dagger2用的是builder模式
component = DaggerBaseActivityComponent.builder().
BaseActivityModule(new BaseActivityModule()).build();
component.inject(this); ?//依賴注入冕象,對應(yīng)上面的BaseActivityComponent
cooker.makeFood("knife");
}
}
上述三步缺一不可,運行之后查看日志就能知道咱們的依賴注入的目的是否達成了汁蝶。這里需要注意的是渐扮,dagger2在尋找依賴提供的時候會優(yōu)先選擇Module提供的依賴,然后再是@Inject提供的依賴穿仪,還有一點是上述給出的例子其實是一個遞歸依賴注入(將CookTool注入Cooker,再將注入好的Cooker注入Activity),希望大家注意掌握與運用席爽。