Android第三方の依賴注入【Dagger/ButterKnife】

目錄:
1、依賴注入
2痒钝、Dagger
3婉支、ButterKnife
4鸯隅、Dagger與ButterKnife對(duì)比

1. 依賴注入

1.1. 概念

依賴注入是一種<a>“設(shè)計(jì)模式”</a>。最早出現(xiàn)在Spring中向挖。
依賴注入:【DI:Dependency Injector】指的是通過一定的規(guī)則管理對(duì)象間的依賴關(guān)系滋迈。依賴注入是控制反轉(zhuǎn)的一種實(shí)現(xiàn)方式。
控制反轉(zhuǎn)【IOC:Inversion of Control】是一個(gè)重要的面向?qū)ο缶幊痰姆▌t户誓,用來削減計(jì)算機(jī)程序的耦合問題。他有兩種實(shí)現(xiàn)方式幕侠,1:依賴注入帝美;2:依賴查找。依賴注入是更好的IOC實(shí)現(xiàn)方式晤硕。

1.2. 作用

將各層的對(duì)象以松耦合的方式組織在一起悼潭,解耦,各層對(duì)象的調(diào)用完全面向接口舞箍。當(dāng)系統(tǒng)重構(gòu)的時(shí)候舰褪,代碼的改寫量將大大減少。

1.3. 實(shí)現(xiàn)方式

依賴注入有幾個(gè)實(shí)現(xiàn)方式:

  • 基于接口
  • 基于set()方法
  • 基于構(gòu)造函數(shù)
  • 基于注解

那么疏橄,安卓有哪些依賴注入框架呢占拍?

1.4. 依賴注入框架

  • Dagger
    A fast dependency injector for Android and Java
  • ButterKnife(JakeWharton)
    Field and method binding for Android views which uses annotation processing to generate boilerplate code for you.
  • Android Annotations
    AndroidAnnotations is an Open Source framework that speeds up Android development.
    It takes care of the plumbing, and lets you concentrate on what's really important.
    By simplifying your code, it facilitates its maintenance.
  • Transfuse
    Transfuse is a Java Dependency Injection (DI) and integration library geared specifically for the Google Android API.

2. Dagger概述

假設(shè)我們有N多個(gè)頁面都要用到某個(gè)對(duì)象,也就是說本來需要在每個(gè)頁面里都實(shí)例化該對(duì)象才可以調(diào)用捎迫。Dagger可以幫我們把這個(gè)依賴對(duì)象的實(shí)例化工作做掉晃酒,我們只需要在需要用到該對(duì)象的類中添加注解(如:UserInfo對(duì)象):

@Inject
UserInfo userInfo;

之后我們就可以直接在該類中使用userInfo這個(gè)對(duì)象了。
當(dāng)然有個(gè)前提窄绒,得先告訴Dagger怎么獲取這個(gè)實(shí)例化對(duì)象贝次。如下:

public class UserInfo{
    @Inject
    public UserInfo(){
    }
    public String getName(){
        return "Lisa";
    }
}

傳送門???Dagger-Github
Dagger官方文檔
看不懂?彰导?蛔翅?,換一個(gè):
Dagger中文文檔

2.1. 配置

在工程根目錄下的build.gradle文件中位谋,在buildscript的dependencies 中添加:

buildscript {
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

在app的build.gradle文件頂部添加插件:

apply plugin: 'com.neenbedankt.android-apt'

在dependencies中添加:

// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'

2.2. 注解標(biāo)簽

@Module:注入對(duì)象提供者所在的模塊山析,可理解為生產(chǎn)實(shí)例的工廠。
@Provides:注入對(duì)象的提供者倔幼,告訴Dagger這是一個(gè)用于提供實(shí)例對(duì)象的函數(shù)
@Component:用于注解接口盖腿。是連接被注入的類與需要被注入的類之間的紐帶。
@Inject:注解預(yù)備被注入的類的構(gòu)造函數(shù),注解注入對(duì)象的實(shí)例翩腐。
@Named:用于給@Provides提供別名鸟款,使用的時(shí)候也加上別名。
@Singleton:單例茂卦,有些類不需要用到不同的實(shí)例對(duì)象何什,就可以添加該注解,實(shí)現(xiàn)單例等龙。 但這個(gè)單例只是范圍內(nèi)的处渣。

注意:

  • Provides函數(shù)以provide為前綴
  • Module類以Module為后綴

參考資料:
[11]——MVP 模式之 先說說 Dagger (2)
個(gè)人覺得是篇不錯(cuò)的入門文章。

3. ButterKnife

傳送門???ButterKnife Github

3.1. 配置

  • 在app中使用
dependencies {
  compile 'com.jakewharton:butterknife:8.5.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
  • 庫中使用配置
    在build.gradle頂部添加插件:
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

在buildscript中添加:

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
  }
}

4.2. 使用

  • 綁定View:
@BindView(R.id.main_recycler_list)
private RecyclerView mRecyclerView;
  • 監(jiān)聽點(diǎn)擊事件
@OnClick(R.id.main_btn_tip)
public void showTip(View view){
 Snackbar.make(view, "This is ButterKnife Demo!!!",Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
}
  • Activity/Fragment綁定ButterKnife
// 在setContentView(R.layout.layout_name)后面綁定
ButterKnife.bind(this);

4. Dagger與ButterKnife對(duì)比

ButterKnife只是做View的注入蛛砰,避免樣板代碼罐栈,代替findViewById()
Dagger能夠注入到任何你想要的對(duì)象泥畅,只要其在module類中荠诬。或者它是構(gòu)造器位仁。但是缺少對(duì)方法和字段的注入支持柑贞。

參考資料

聊聊 Android 中的依賴注入
Android Dagger依賴注入框架淺析
android依賴注入框架Dagger和Butterknife實(shí)戰(zhàn)
[11]——MVP 模式之 先說說 Dagger (2)
ButterKnife使用和原理
再次聲明,阿喵只是知識(shí)的搬運(yùn)工聂抢。钧嘶。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琳疏,一起剝皮案震驚了整個(gè)濱河市有决,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轿亮,老刑警劉巖疮薇,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異我注,居然都是意外死亡按咒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門但骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來励七,“玉大人,你說我怎么就攤上這事奔缠÷犹В” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵校哎,是天一觀的道長两波。 經(jīng)常有香客問我瞳步,道長,這世上最難降的妖魔是什么腰奋? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任单起,我火速辦了婚禮,結(jié)果婚禮上劣坊,老公的妹妹穿的比我還像新娘嘀倒。我一直安慰自己,他們只是感情好局冰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布测蘑。 她就那樣靜靜地躺著,像睡著了一般康二。 火紅的嫁衣襯著肌膚如雪碳胳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天沫勿,我揣著相機(jī)與錄音固逗,去河邊找鬼。 笑死藕帜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惜傲。 我是一名探鬼主播洽故,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼盗誊!你這毒婦竟也來了时甚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤哈踱,失蹤者是張志新(化名)和其女友劉穎荒适,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體开镣,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刀诬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邪财。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陕壹。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖树埠,靈堂內(nèi)的尸體忽然破棺而出糠馆,到底是詐尸還是另有隱情,我是刑警寧澤怎憋,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布又碌,位于F島的核電站九昧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毕匀。R本人自食惡果不足惜铸鹰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望期揪。 院中可真熱鬧掉奄,春花似錦、人聲如沸凤薛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缤苫。三九已至速兔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間活玲,已是汗流浹背涣狗。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舒憾,地道東北人镀钓。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像镀迂,于是被迫代替她去往敵國和親丁溅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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