dagger2從入門到放棄-其他用法
這章介紹下之前遺漏的用法
Provider多次注入
用在需要提供多個依賴的場景
@Inject Provider<SimpleInjectBean> mSimpleInjectBeanProvider; mSimpleInjectBeanProvider.get();
雖然是用在提供多個依賴的場景,但是使用Provider返回的也可能是同一個物件
如果依賴是區域性單例或者@Provides方法每次返回的都是同一個物件,那麼Provider.get()返回的是相同的例項
Lazy 延遲注入
@Inject Lazy<SimpleInjectBean> mSimpleInjectBeanLazy; mSimpleInjectBeanLazy.get();
不管要注入的依賴是否是區域性單例,每次get()的例項都是相同的
@Qualifier
在dagger中是用型別來區分是否是不同的依賴了,如果在不同的地方提供了相同型別的依賴就會造成依賴迷失;
例如在AppModule中提供了一個String型別的appName,在ActivityModule中提供了一個String型別的activityName,在將向Activity中能夠注入String時dagger就不知道需要的到底是哪個String,網上的說法叫依賴迷失
為了解決依賴迷失的問題,需要對相同型別的不同依賴進行區分,這裡用的就是@Qualifier註解
//先看看預設提供的@Named註解 //使用String作為key來區分依賴 @Qualifier @Documented @Retention(RUNTIME) public @interface Named { /** The name. */ String value() default ""; }
//提供依賴的方法,標記@Qualifier註解 @Provides @Named(value = "AppName") String provideAppName() { return "DaggerInAction"; } @Provides @ActivityScope @Named(value = "ActivityName") String provideDaggerAndroidActivityName() { return "DaggerAndroidActivity"; } //需要被注入的依賴,也要標記@Qualifier註解 @Inject @Named(value = "AppName") String appName; @Inject @Named(value = "ActivityName") String activityName;
如果一個提供依賴的地方用了@Qualifier註解標記,要注入的時候也必須使用相同的@Qualifier註解和key進行標記,否則dagger會找不到依賴
相當於 @Qualifier註解是創造了一個新的型別
@BindsOptionalOf
提供可空的依賴
//在@Module中定義提供可空依賴的方法 @BindsOptionalOf abstract CoffeeCozy optionalCozy();
- Optional<CoffeeCozy> (unless there is a @Nullable binding for CoffeeCozy; see below)
- Optional<Provider<CoffeeCozy>>
- Optional<Lazy<CoffeeCozy>>
- Optional<Provider<Lazy<CoffeeCozy>>>
ofollow,noindex">optional-bindings