这章介绍下之前遗漏的用法
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>>>
相关文章
dagger2从入门到放弃-概念
dagger2从入门到放弃-最基础的用法介绍
dagger2从入门到放弃-Component的继承体系、局部单例
dagger2从入门到放弃-ActivityMultibindings
dagger2从入门到放弃-dagger.android
dagger2从入门到放弃-其他用法
dagger2从入门到放弃-多模块项目下dagger的使用
dagger2从入门到放弃-为何放弃
示例代码
DaggerInAction
欢迎star
master分支上最新的代码可能会比当前文章的示例代码稍微复杂点,提交记录里包含了每一步的迭代过程,可以顺藤摸瓜