Dagger2神器入門(四)

前序

Dagger2神器入門(一)
Dagger2神器入門(二)
Dagger2神器入門(三)
在上面的一系列文章中稍坯,我們了解了
1)什么是依賴注入罪既?
2)如何使用Dagger2進行依賴注入?
3)為什么要使用Dagger2?
......如果沒有弄清楚這些問題婿奔,可以翻看之前的blog。那么這一章主要是來看看依賴注入的其他注解问慎。

其他注解概覽

我們經(jīng)常使用的@Inject其實是在javax.inject注解包中萍摊,而我們的@Component,@Module和@Provides注解都在dagger2的包中如叼。這一章節(jié)我們主要來看看javax.inject中的其他未使用的注解冰木。
首先先上一個包的截圖:

javax-inject.jpeg

如圖:除了我們經(jīng)常使用的@Inject注解之外,還有諸如@Named笼恰,@Qualifier等其他注解踊沸。下面,我們通過例子來了解一下@Named,@Qualifier注解是如何使用社证?

@Qualifier

我們在上一節(jié)中了解到逼龟,@Inject只能作用于一個構造器;

@Inject  can apply to at most one constructor per class追葡。

如果一個類有很多構造器腺律,而我們想使用他們奕短,而不是僅僅一個,該如何做呢匀钧?那么接下來我們就接著上面的例子:

public class Leather {
  public Leather(){
      Log.d(Config.TAG,"new Leather()");
  }

  public Leather(String color){
      Log.d(Config.TAG,"new Leather() color:"+color);
    }
 }

如上面代碼翎碑,我們的Leather有2個構造器,一個是默認無參構造器之斯,一個是帶參數(shù)構造器日杈;那么我們如何在@Inject的時候去選擇性的使用其中的任何一個構造器呢?

我們知道吊圾,所有的依賴提供都來自于CarModule類达椰,那么我們就要在Module類中做文章;在此之前我們首先要了解下@Qualifier注解是什么项乒?如何使用啰劲?最后才通過demo去看看效果。

官方@Qualifier是一個修飾器檀何,這樣說肯定也很懵逼蝇裤,我們還是通過大家熟悉的代碼來展現(xiàn)吧。我們一般按照下面方式使用依賴注入

@Inject
Leather leather;

這樣的注解就能達到自動初始化的目的频鉴,然而這只能在一個類中初始化一個構造器栓辜;那么我們現(xiàn)在加上@Qualifier注解,來修飾一下垛孔,這樣就能達到一個類存在多個構造器時,通過修飾器來限定初始化哪個類周荐。與其說是修飾器狭莱,不如說是限定符。如果這樣解釋還是不明白概作,那我們來看一個demo腋妙。

首先我們自定義一個注解

@Qualifier  
@Documented  
@Retention(RetentionPolicy.RUNTIME)
public @interface LeatherColor {
    String color() default "white";
}

我們使用@Qualifier來修飾注解。

另話:其實關于注解這塊內容還是有很多可講的讯榕,包括如何自定義注解骤素,注解的工作機制等等,希望后期有時間能夠慢慢輸出愚屁,畢竟是一字一字碼出來的济竹,而不是隨便網(wǎng)上copy。

上面我們自定義一個注解@LeatherColor霎槐,如何使用呢送浊?在需要使用Leather的地方通過@Inject注入,我們現(xiàn)在是在Car類中

 @LeatherColor(color = "black")
 @Inject
 Leather leather;

就是這么簡單栽燕,自定義完之后在你需要@Inject的地方添加限定即可罕袋。那這么做就完了?肯定不是的碍岔,我們還需要在我們提供依賴的地方做下改動

  @Provides
  public Leather provideLeather(){
      return new Leather();
  }
 @LeatherColor(color = "black")
 @Provides
 public Leather provideIntLeather()  {
    return new Leather("black");
  }

這樣浴讯,在遇到(color = "black")的時候,就會初始化類 new Leather("black"),看看運行效果蔼啦?

07-07 10:07:49.208 9160-9160/? D/TAG: new Leather() color:black
07-07 10:07:49.208 9160-9160/? D/TAG: new Engine()
07-07 10:07:49.209 9160-9160/? D/TAG: new Seat()
07-07 10:07:49.209 9160-9160/? D/TAG: new Wheel()
07-07 10:07:49.209 9160-9160/? D/TAG: new Car()

總結一下上面使用步驟:
1 首先使用@Qualifier自定義注解榆纽,在這個例子中我們自定義的是@LeatherColor
2 然后在@Inject的地方添加自定義注解限制;如 @LeatherColor(color="black")
3 最后在提供依賴的Module類中添加相關依賴限制捏肢;在這個例子中奈籽,如果我們@Inject注解帶有@LeatherColor并且它的color="black",就會執(zhí)行
new Leather("black"),否則就會執(zhí)行默認provides。

到這里我們基本了解了@Qualifier注解的基本使用鸵赫,那么接下來我們看看@Named注解衣屏;

@Named

如果了解了@Qualifier注解之后,那么對于這個注解辩棒,就很輕松了狼忱。直接上源碼

@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Named {
    /** The name. */
    String value() default "";
}

可以看出,這個注解和我們自定義的注解一樣一睁?不過還是有區(qū)別的钻弄。簡單說下
@Named 是基于@Qualifier的注解,不過只能傳遞字符串
@Qualifier 包括但不限于字符串者吁,如枚舉等窘俺。
他們的功能是一樣的,在這里就不舉例說明了复凳。

總結

通過上面的demo瘤泪,不知道各位是不是發(fā)現(xiàn)了一個Dagger2的局限性?具體是什么局限呢染坯?在這里先不說明白均芽,在下一章的時候會和大家討論討論。期待吧......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
禁止轉載单鹿,如需轉載請通過簡信或評論聯(lián)系作者掀宋。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仲锄,隨后出現(xiàn)的幾起案子劲妙,更是在濱河造成了極大的恐慌,老刑警劉巖儒喊,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镣奋,死亡現(xiàn)場離奇詭異,居然都是意外死亡怀愧,警方通過查閱死者的電腦和手機侨颈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門余赢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哈垢,你說我怎么就攤上這事妻柒。” “怎么了耘分?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵举塔,是天一觀的道長。 經(jīng)常有香客問我求泰,道長央渣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任渴频,我火速辦了婚禮芽丹,結果婚禮上,老公的妹妹穿的比我還像新娘枉氮。我一直安慰自己志衍,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布聊替。 她就那樣靜靜地躺著楼肪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惹悄。 梳的紋絲不亂的頭發(fā)上春叫,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音泣港,去河邊找鬼暂殖。 笑死,一個胖子當著我的面吹牛当纱,可吹牛的內容都是我干的呛每。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坡氯,長吁一口氣:“原來是場噩夢啊……” “哼晨横!你這毒婦竟也來了?” 一聲冷哼從身側響起箫柳,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤手形,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悯恍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體库糠,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年涮毫,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞬欧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贷屎。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艘虎,靈堂內的尸體忽然破棺而出豫尽,到底是詐尸還是另有隱情,我是刑警寧澤顷帖,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站渤滞,受9級特大地震影響贬墩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜妄呕,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一陶舞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绪励,春花似錦肿孵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至大莫,卻和暖如春蛉腌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只厘。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工烙丛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羔味。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓河咽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赋元。 傳聞我的和親對象是個殘疾皇子忘蟹,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容