Android依賴注入框架Dagger2學(xué)習(xí)筆記

依賴注入

面向?qū)ο缶幊痰囊环N設(shè)計(jì)模式扑媚,目的是為了降低程序中類與類之間的依賴引起的耦合霉祸。

在Java中客们,依賴注入有
  • 通過(guò)接口注入
  • 通過(guò)set方法注入
  • 通過(guò)構(gòu)造方法注入
  • 通過(guò)注解注入

Dagger2

官網(wǎng)

為什么要用Dagger

  • 讓你不需要初始化對(duì)象。也就是說(shuō)任何對(duì)象聲明完了就能直接用缭裆。另外一種說(shuō)法:使用類和被依賴的對(duì)象構(gòu)造分開,這樣如果我們需要改變被依賴類的構(gòu)造方法,不必改動(dòng)每一個(gè)使用類寿烟。

  • 降低大型項(xiàng)目的耦合度

我們?yōu)槭裁匆袲agger2,MVP以及Rxjava引入項(xiàng)目中?


簡(jiǎn)單的示例

比如現(xiàn)在我們要在RecycleView中顯示一系列數(shù)據(jù)澈驼,那么我們需要在Activity中引用RecyclerViewAdapter。

最原始的構(gòu)造方法注入的寫法

MainActivity

public class MainActivity extends AppCompatActivity {
    List<String> list = new ArrayList<>();
    RecyclerView recyclerView;
    ARecyclerViewAdapter aRecyclerViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.rv);
        for (int i = 0; i < 30; i++) {
            list.add("item" + i);
        }
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //實(shí)例化并傳入list數(shù)據(jù)
        aRecyclerViewAdapter = new ARecyclerViewAdapter(list);
        recyclerView.setAdapter(aRecyclerViewAdapter);
    }
}

adapter


public class ARecyclerViewAdapter extends RecyclerView.Adapter<ARecyclerViewAdapter.AViewHolder>{

    private List<String> list ;

    public ARecyclerViewAdapter(List<String> list) {
        this.list = list;
    }

    @Override
    public AViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);
        return new AViewHolder(view);
    }

    @Override
    public void onBindViewHolder(AViewHolder holder, int position) {
        holder.textView.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class AViewHolder extends RecyclerView.ViewHolder{
        TextView textView;
        public AViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv);
        }
    }
}

現(xiàn)在用Dagger2來(lái)改造筛武,總體來(lái)說(shuō)就是4步:

  • 1 在Adapter構(gòu)造器中加入@Inject注解
  • 2 構(gòu)建 Module
  • 3 構(gòu)建 Component
  • 4 完成依賴注入

1 MainActivity中

public class MainActivity extends AppCompatActivity {
    List<String> list = new ArrayList<>();


    RecyclerView recyclerView;
    //1 這里對(duì)注入類聲明并用注解@Inject標(biāo)記
    @Inject
    ARecyclerViewAdapter aRecyclerViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.rv);
        for (int i = 0; i < 30; i++) {
            list.add("item" + i);
        }
//        aRecyclerViewAdapter = new ARecyclerViewAdapter(list);
        
        
        ....
        ....
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(aRecyclerViewAdapter);
    }


}

在ARecyclerViewAdapter中

@Inject
public ARecyclerViewAdapter(List<String> list) {
        this.list = list;
    }

其實(shí)就是在倆個(gè)地方加了Inject注解

2 寫Module

@Module
public class ListModule {
    List<String> list;
    //引入數(shù)據(jù)
    public ListModule(List<String> list) {
        this.list = list;
    }

     //提供數(shù)據(jù)
    @Provides
    @ActivityScope
    List<String> provideList(){
        return list;
    }
}

原來(lái)的adapter的構(gòu)造方法是

 public ARecyclerViewAdapter(List<String> list) {
        this.list = list;
    }

這里這個(gè)list要從MainActivity中注入到adapter的缝其,用module來(lái)提供數(shù)據(jù)挎塌,上面的provideList()方法就是提供數(shù)據(jù)的,用了Provides注解内边。這里adapter只有一個(gè)參數(shù)榴都,如果有多個(gè)參數(shù),同理都在Module中用provide開頭方法提供漠其。

@ActivityScope 是一個(gè)自定義的范圍注解嘴高,作用是允許對(duì)象被記錄在正確的組件中,當(dāng)然這些對(duì)象的生命周期應(yīng)該遵循 Activity 的生命周期

import java.lang.annotation.Retention;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;

 import javax.inject.Scope;

 @Scope
 @Retention(RUNTIME)
 public @interface ActivityScope {
}

3 Component

負(fù)責(zé)注入依賴

@ActivityScope
@Component(modules = {ListModule.class})
public interface ListComponent {
    void inject(MainActivity mainActivity);
}

這里void inject(MainActivity mainActivity)要注意這里必須是真正消耗依賴的類型 MainActivity

4 在MainActivity中

onCreate方法中

DaggerListComponent.builder().listModule(new ListModule(list)).build().inject(this);

這樣就完了


為什么用Dagger

我們?yōu)槭裁匆袲agger2,MVP以及Rxjava引入項(xiàng)目中?
Dagger——Android上的依賴注入框架

參考資料

Dagger 2: Step To Step
Dagger2從入門到放棄再到恍然大悟
Using Dagger2 in Android
Dagger是什么和我們?cè)趺赐ㄟ^(guò)使用它獲得收獲


end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末和屎,一起剝皮案震驚了整個(gè)濱河市阳惹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眶俩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件快鱼,死亡現(xiàn)場(chǎng)離奇詭異颠印,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抹竹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門线罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人窃判,你說(shuō)我怎么就攤上這事钞楼。” “怎么了袄琳?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵询件,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我唆樊,道長(zhǎng)宛琅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任逗旁,我火速辦了婚禮嘿辟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘片效。我一直安慰自己红伦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布淀衣。 她就那樣靜靜地躺著昙读,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膨桥。 梳的紋絲不亂的頭發(fā)上箕戳,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天某残,我揣著相機(jī)與錄音,去河邊找鬼陵吸。 笑死玻墅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的壮虫。 我是一名探鬼主播澳厢,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囚似!你這毒婦竟也來(lái)了剩拢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饶唤,失蹤者是張志新(化名)和其女友劉穎徐伐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募狂,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡办素,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祸穷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片性穿。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雷滚,靈堂內(nèi)的尸體忽然破棺而出需曾,到底是詐尸還是另有隱情,我是刑警寧澤祈远,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布呆万,位于F島的核電站,受9級(jí)特大地震影響车份,放射性物質(zhì)發(fā)生泄漏桑嘶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一躬充、第九天 我趴在偏房一處隱蔽的房頂上張望逃顶。 院中可真熱鬧,春花似錦充甚、人聲如沸以政。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盈蛮。三九已至,卻和暖如春技矮,著一層夾襖步出監(jiān)牢的瞬間抖誉,已是汗流浹背殊轴。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袒炉,地道東北人旁理。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像我磁,于是被迫代替她去往敵國(guó)和親孽文。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容