Dagger2学习笔记(一)

环境配置

在Module中build.gradle中添加如下代码

//kotlin
apply plugin: 'kotlin-kapt'

//java
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.google.dagger:dagger:2.14.1'
    //kotlin
    kapt 'com.google.dagger:dagger-compiler:2.14.1'

    //java
    apt 'com.google.dagger:dagger-compiler:2.14.1'
}

@Inject

1、Dagger内置注解
2、用来标注目标对象
3、用来标注依赖类构造方法

//标注目标对象
lateinit var mainPresenter : MainPresenter
        @Inject set

//标注构造方法
class MainPresenter @Inject constructor() {

}

如果依赖类的构造标注了该注解,Dagger会通过构造实例化将该类注入到目标成员变量上。

@Component

1、目标对象和依赖类构造不会凭空建立联系,需要Component将他们建立联系。
2、标注类必须为接口或抽象类

@Component
interface MainComponent {
    fun inject(mainActivity : MainActivity)
}

编写编译完成后,Dagger会自动生成一个以Dagger开头的Component文件。

使用Component建立联系

DaggerMainComponent.create().inject(this)

@Module

1、如果目标类含有参构造或该类为接口或第三方类库时,需要使用一个含有@Module注解的工厂类提供实例。
2、一个Component可以有多个Module

//创建MainPresenter实例需要一个String类型的参数
class MainPresenter @Inject constructor(str : String) {

}

//添加module
@Component(modules = arrayOf(MainModule::class))
interface MainComponent {
    fun inject(mainActivity: MainActivity)
}

@Module
class MainModule {

    //使用Provides注解标注由该方法提供实例
    @Provides
    fun providesMainPresenter(): Ts {
        return MainPresenter("mainPresenter")
    }
}

//建立联系的代码也需要更改
DaggerMainComponent.builder()
                .mainModule(MainModule())
                .build()
                .inject(this)

你可能感兴趣的:(Dagger2学习笔记(一))