一个简单的Dagger注入实例

这篇文章我们会用12行代码来展示最简单的Dagger的使用。代码使用kotlin,用gradle编译,配置代码使用groovy。

首先我们使用gradle init生成最基础的基于kotlin的Application工程。使用的gradle版本是7.5.1, 也可以直接fork最后的sample code。(这个sample code使用的是gradlew,就不用纠结全局的gradle版本了)

为了避免不必要的编译错误,务必保持版本一直或者相近,否则会造成诸如包找不到等错误

然后我们引入kotlin-kapt插件

id "org.jetbrains.kotlin.kapt" version "1.7.21"

因为Dagger是通过在编译期帮你生成模板代码来完成注入的,所以需要kapt插件

接着添加依赖

implementation 'com.google.dagger:dagger:2.44.2'  
kapt 'com.google.dagger:dagger-compiler:2.44.2'

最后添加功能代码。

class App {  
    init {  
        DaggerAppComponent.create().inject(this)  
    }  
      
    // 在App类中声明一个成员变量info,并使用Inject注解告诉Dagger这个对象需要注入  
    @Inject lateinit var info : Info  
    val greeting: String  
        get() {  
            return "Hello World!"  
        }  
}  
  
/**  
 * 容器类,用于通知Dagger需要注入的对象  
 */  
@Component  
interface AppComponent {  
    fun inject(app: App)  
}  
  
/**  
 * 注入的对象类  
 */  
class Info @Inject constructor() {  
    val greeting = "hello dagger"  
}  
  
fun main() {  
    println(App().greeting)  
    // 测试注入是否成功  
    println(App().info.greeting)  
}

我们要完成的功能很简单,创建一个Info实例并赋值给App类中的info变量。上述代码分成四个部分

  1. 创建Info类,并使用Inject注解constructor函数,告知Dagger这个类的实例使用此构造函数创建
  2. 在App类中创建Info成员变量,并使用Inject注解,告知Dagger这个类的这个变量需要注入
  3. 创建AppCompoent容器,用于开发人员通知Dagger要注入哪个对象。
  4. 调用App类中的info属性,测试注入是否成功

第1,2,4部分都比较好理解,第3部分是因为Dagger只知道将Info对象注入到App类,但是是哪个App类的实例Dagger并不知道,所以需要开发人员主动告知。需要在类的初始化时候就完成这个动作。

    init {  
        DaggerAppComponent.create().inject(this)  
    } 

这里的inject函数的函数名可以是任意的,用inject命名只是遵循通用的命名法。DaggerAppComponent是Dagger框架为AppComponent接口自动生成的实现类,完成了Info的注入。具体实现可以看build/generated/source/kapt/main/example/dagger/DaggerAppComponent.java文件里代码实现

到这里一个简单的Dagger演示代码完成。完整的代码在这里