Dagger2笔记

Inject

  • 标记在构造方法上 :一会在Activity中当系统需要对VpAdater的实例进行注入的时候,会自动调用具有@Inject注解的构造方法
  • 标记在需要依赖的变量上 :以让Dagger2为其提供依赖

Module

前面@Inject的实例化对象中,参数应该怎么传递,就是用@Module

  • 使用了@Module注解的类专门提供依赖,谁需要依赖,都可以从这里获取

Provider

注解方法,该注解只可以在@Module中使用,使用了该注解的方法在需要提供依赖时被调用

Component

一个接口,@Inject@Module之间的桥梁,也称作注入器

我的理解是统一的组织者调度这 如 ApplicationComponent ActivityComponent

  • fun inject(obj:目标类):从目标类开始查找@Inject注解,生成依赖注入的代码;
  • fun xxx():Obj:生成Obj实例,供其它组件使用(如果Obj本身还包含其它依赖注入,也会自动生成对应实例)

ApplicationComponentActivityComponent提供的是一种服务能力,供业务组件使用,服务能力的来源就是对应Module的工厂方法。

Scope

定义作用于注解的注解

通过我们的代码层次,大家可以看到,Scope到底有什么用?

  • 管理Component层次结构,明确地显示Component的作用范围;
  • 管理ComponentModule之间的匹配关系,提供代码的可读性;
  • Scope就是用来看的,并没有依赖注入的实质功能,为了大家的代码更加优雅,建议使用Scope明确作用域
  • 使用DependenciesComponent之间不能有相同 @Scope 注解的;使用@SubComponent

Qualifier

情景:需要提供相同的类型,如何区分应该使用Module中的哪一个provider来提供呢?

这个时候就可以使用Qualifier来标注 @Name:本质就是一个Qualifier,使用方式下面一并介绍

使用如下:

  1. 定义限定符

/**
 * Java中
 */
Documented
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface AgeQualifier{
}



/*
 * Kotlin中使用
 *Age 限定符
 */
@Qualifier
@Documented
@Retention(AnnotationRetention.RUNTIME)
annotation class AgeQualifier
  1. Module中的provider使用


    @AgeQualifier
    @Provides
    fun providerAgeStr(): String {
        return "age"
    }

    @Named("id")
    @Provides
    fun providerId(): Int {
        return 1
    }

  1. 对象或者构造方法中使用
class Phone
@Inject constructor(
        @NameQualifier val name: String,
        @AgeQualifier val age: String,
        @Named("id") val id: Int) {
    init {
        id.log()
        name.log()
        age.log()
    }
}


或者在对像中使用
//    @field:[AgeQualifier]
    @AgeQualifier
    @Inject
    lateinit var mPhone: Phone