本文適用讀者:已經(jīng)熟練掌握Android編程惑畴,并且用過butterknife的程序員辐棒。最好是看了很多其他dagger2文章還沒有學(xué)會(huì)的人行剂。
dagger2秕噪,是什么?依賴注入框架厚宰。什么是依賴注入腌巾?咱說人話,依賴铲觉,就是需要某個(gè)東西澈蝙,沒有它不行。注入撵幽,把一個(gè)東西送到另一個(gè)東西里面灯荧。依賴注入啥意思?就是把需要東西送到某個(gè)地方盐杂。比如逗载,你要寫鋼筆字,鋼筆沒水了链烈。你需要墨水厉斟,把墨水注入到鋼筆里。加墨水這個(gè)動(dòng)作强衡,就是依賴注入擦秽。在咱android上就是,你在某個(gè)Activity里面需要某個(gè)類漩勤,通過dagger2把這個(gè)類送到這個(gè)Activity里号涯,你可以在這個(gè)Activity里使用這個(gè)類。
下面講dagger2锯七,打開android studio。創(chuàng)建一個(gè)新project誉己。在build gradle里粘貼下面的代碼眉尸,然后synk
compile'com.google.dagger:dagger:2.16'
annotationProcessor'com.google.dagger:dagger-compiler:2.16'
既然是包教包會(huì),我們就以包子為例。
先建一個(gè)包子類,韭菜包子噪猾。
import javax.inject.Inject;
public class Baozi {
String type = "韭菜";
@Inject
public Baozi() {
}
}
和以前不一樣的地方是有個(gè)“@Inject”霉祸,這是個(gè)注解,就是說袱蜡,我們要送的東西丝蹭,就是包子這個(gè)類。大家用過butterKinfe黃油刀吧坪蚁?和butterknife那個(gè)@bind或者@bindview 很像奔穿。
MainActivity,相當(dāng)于辦公室敏晤,使用(食用)包子的一個(gè)場景贱田。
我寫了個(gè)按鈕,點(diǎn)一下嘴脾,能吃包子男摧,知道什么餡的。
public class MainActivity extends AppCompatActivity {
Button btnEat;
@Inject
Baozi baozi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定
btnEat = findViewById(R.id.eat);
//點(diǎn)擊事件
btnEat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
}
});
}
}
包子有了译打,Activity是咱的辦公室『耐兀現(xiàn)在要把包子送到辦公室里∽嗨荆或者說把Baozi類注入到MainActivity里乔询。點(diǎn)了包子外賣,由送餐員送到辦公室结澄。在dagger2里哥谷,誰是送餐員呢?他的名字叫“朱建”麻献,英文名Component们妥。中文意思是組件。我也不知道為什么叫component這個(gè)怪名字勉吻。記住中文名叫“朱建(組件)”监婶,英文名叫component就好了。
創(chuàng)建組件齿桃,送餐員惑惶,類名是MainComponent ,要注意的是這個(gè)是個(gè)接口interface短纵,不是類class带污。
import dagger.Component;
@Component()
public interface MainComponent {
void inject(MainActivity activity);
}
函數(shù)inject,代表要注入香到,也就是送餐鱼冀。送到什么地方呢报破?寫到函數(shù)參數(shù)里(MainActivity activity)。
接下來按ctrl + F9,也就是build菜單下make project, Dagger2通過編譯器會(huì)在某些文件夾下生成一些類千绪。這個(gè)類就是我們的送餐員充易,它把我們需要的類(包子)送到需要的地方-辦公室(MainActivity)。這個(gè)類的名字是Dagger+MainComponent 荸型,DaggerMainComponent
命名方式推薦為: 目標(biāo)類名+Component 盹靴,在編譯后Dagger2就會(huì)為我們生成 DaggerXXXComponent 這個(gè)類
注入代碼是
DaggerMainComponent.builder().build().inject(this);
在MainActivity里寫上上面這句一運(yùn)行,包子就送到辦公室瑞妇,Baozi就注入到了MainActivity里面稿静。好奇怪,這個(gè)類竟然不用import踪宠,請高手指點(diǎn)為什么自赔。
點(diǎn)擊“吃”按鈕,toast顯示“韭菜”柳琢。我們知道什么餡的了绍妨。哈哈。
這樣柬脸,dagger2最簡單的使用方法你已經(jīng)會(huì)了他去。
最終代碼如下:
public class MainActivity extends AppCompatActivity {
Button btnEat;
@Inject
Baozi baozi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnEat = findViewById(R.id.eat);
DaggerMainComponent
.builder()
.build()
.inject(this);
btnEat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
}
});
}
}
復(fù)習(xí)一下使用步驟
1.創(chuàng)建要注入的類,構(gòu)造方法要加@inject
2.在你需要的地方(比如Activity里面)倒堕,聲明這個(gè)類時(shí)灾测,也要加@inject
3.創(chuàng)建component,聲明inject方法垦巴,參數(shù)是你需要用這個(gè)類的地方媳搪,比如某個(gè)Activity。不要忘了@Component()
4.按Ctrl + F9,或者build菜單下make project骤宣,生成daggerXXXComponent類秦爆。
5.在Activity里寫
DaggerXXXComponent
.builder()
.build()
.inject(this);
這樣你就可以使用注入的類了。
包教包會(huì)憔披,現(xiàn)在dagger2最簡單的用法你會(huì)不會(huì)了等限?不會(huì)的話,請留言芬膝,我改進(jìn)文章望门,到能看會(huì)為止。
再說一下dagger2 的優(yōu)點(diǎn)锰霜。為什么用dagger2筹误?直接在Activity里面new 一個(gè)類就行了。也就是說癣缅,為啥要送餐員厨剪?直接在辦公室做包子就行了勘畔。問題是,Activity可能有很多丽惶。萬一這個(gè)類的構(gòu)造方法發(fā)生改變,就要在每一個(gè)Activity里面重寫構(gòu)造方法爬立。如果包子要改成豬肉餡的钾唬,要在每個(gè)辦公室里改包子。重復(fù)很多遍侠驯。如果用dagger2抡秆,只要在要注入的類里面改就好了。只需要改一遍吟策。
下一篇介紹dagger2更多的用法儒士。
http://www.reibang.com/p/807fd29283f4