Android开发Android-Rxjava&retrofit&daggerAndroid开发经验谈

dagger2从入门到放弃-其他用法

2018-11-01  本文已影响4人  sunhapper

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

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-bindings

相关文章

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

示例代码

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

上一篇下一篇

猜你喜欢

热点阅读