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

作者: sunhapper | 来源:发表于2018-11-01 20:57 被阅读4次

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

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

    optional-bindings

    相关文章

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

    示例代码

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

    相关文章

      网友评论

        本文标题:dagger2从入门到放弃-其他用法

        本文链接:https://www.haomeiwen.com/subject/atrfxqtx.html