一个简单的Dagger注入实例
25 Nov 2022这篇文章我们会用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变量。上述代码分成四个部分
- 创建Info类,并使用Inject注解constructor函数,告知Dagger这个类的实例使用此构造函数创建
- 在App类中创建Info成员变量,并使用Inject注解,告知Dagger这个类的这个变量需要注入
- 创建AppCompoent容器,用于开发人员通知Dagger要注入哪个对象。
- 调用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演示代码完成。完整的代码在这里