tags: [dagger2,架构,android]
categories: dagger2
top: false
toc: true
cover: false
img: /featureImg/dagger.jpg
summary: 其他进阶用法
—-

这章介绍下之前遗漏的用法

Provider多次注入

用在需要提供多个依赖的场景

  1. @Inject
  2. Provider<SimpleInjectBean> mSimpleInjectBeanProvider;
  3. mSimpleInjectBeanProvider.get();

虽然是用在提供多个依赖的场景,但是使用Provider返回的也可能是同一个对象
如果依赖是局部单例或者@Provides方法每次返回的都是同一个对象,那么Provider.get()返回的是相同的实例

Lazy 延迟注入

  1. @Inject
  2. Lazy<SimpleInjectBean> mSimpleInjectBeanLazy;
  3. mSimpleInjectBeanLazy.get();

不管要注入的依赖是否是局部单例,每次get()的实例都是相同的

@Qualifier

在dagger中是用类型来区分是否是不同的依赖了,如果在不同的地方提供了相同类型的依赖就会造成依赖迷失;
例如在AppModule中提供了一个String类型的appName,在ActivityModule中提供了一个String类型的activityName,在将向Activity中能够注入String时dagger就不知道需要的到底是哪个String,网上的说法叫依赖迷失
为了解决依赖迷失的问题,需要对相同类型的不同依赖进行区分,这里用的就是@Qualifier注解

  1. //先看看默认提供的@Named注解
  2. //使用String作为key来区分依赖
  3. @Qualifier
  4. @Documented
  5. @Retention(RUNTIME)
  6. public @interface Named {
  7. /** The name. */
  8. String value() default "";
  9. }
  1. //提供依赖的方法,标记@Qualifier注解
  2. @Provides
  3. @Named(value = "AppName")
  4. String provideAppName() {
  5. return "DaggerInAction";
  6. }
  7. @Provides
  8. @ActivityScope
  9. @Named(value = "ActivityName")
  10. String provideDaggerAndroidActivityName() {
  11. return "DaggerAndroidActivity";
  12. }
  13. //需要被注入的依赖,也要标记@Qualifier注解
  14. @Inject
  15. @Named(value = "AppName")
  16. String appName;
  17. @Inject
  18. @Named(value = "ActivityName")
  19. String activityName;

如果一个提供依赖的地方用了@Qualifier注解标记,要注入的时候也必须使用相同的@Qualifier注解和key进行标记,否则dagger会找不到依赖
相当于 @Qualifier注解是创造了一个新的类型

@BindsOptionalOf

提供可空的依赖

  1. //在@Module中定义提供可空依赖的方法
  2. @BindsOptionalOf abstract CoffeeCozy optionalCozy();

相关文章

dagger2从入门到放弃-概念
dagger2从入门到放弃-最基础的用法介绍
dagger2从入门到放弃-Component的继承体系、局部单例
dagger2从入门到放弃-ActivityMultibindings
dagger2从入门到放弃-dagger.android
dagger2从入门到放弃-其他用法
dagger2从入门到放弃-多模块项目下dagger的使用
dagger2从入门到放弃-为何放弃

示例代码

DaggerInAction 欢迎star master分支上最新的代码可能会比当前文章的示例代码稍微复杂点,提交记录里包含了每一步的迭代过程,可以顺藤摸瓜