前序
Dagger2神器入門(一)
Dagger2神器入門(二)
Dagger2神器入門(三)
在上面的一系列文章中稍坯,我們了解了
1)什么是依賴注入罪既?
2)如何使用Dagger2進行依賴注入?
3)為什么要使用Dagger2?
......如果沒有弄清楚這些問題婿奔,可以翻看之前的blog。那么這一章主要是來看看依賴注入的其他注解问慎。
其他注解概覽
我們經(jīng)常使用的@Inject其實是在javax.inject注解包中萍摊,而我們的@Component,@Module和@Provides注解都在dagger2的包中如叼。這一章節(jié)我們主要來看看javax.inject中的其他未使用的注解冰木。
首先先上一個包的截圖:
如圖:除了我們經(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的局限性?具體是什么局限呢染坯?在這里先不說明白均芽,在下一章的時候會和大家討論討論。期待吧......