Dagger 2 完全解析(五),Kotlin 中使用 Dagger 2

Dagger 2 完全解析系列:

Dagger 2 完全解析(一),Dagger 2 的基本使用与原理

Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等

Dagger 2 完全解析(三),Component 的组织关系与 SubComponent

Dagger 2 完全解析(四),Android 中使用 Dagger 2

Dagger 2 完全解析(五),Kotlin 中使用 Dagger 2

Dagger 2 完全解析(六),dagger.android 扩展库的使用

上面文章地址是我博客上的地址,本系列文章是基于 Google Dagger 2.11-rc2 版本

Google I/O 2017 大会上宣布 Kotlin 成为 Android 开发一级语言,kotlin 语言作为 Google 的亲儿子,前途一片光明,而且 Kotlin 加入了很多现代语言特性。最近把我之前写的一个开源项目重构为 Kotlin 版本 -- Kotlin 版本的 Gank app,以此来学习 kotlin 语言。其中在 Kotlin 语言中使用 Dagger 2 的写法与 Java 中有些变化,所以写下这篇文章记录下如何在 Kotlin 语言中使用 Dagger 2。

本文中的 Kotlin 版本为 1.1.2-5

Dagger 2 依赖

引入方式与之前有所区别,Dagger 2 根据注解在编译时生成静态代码,所以需要注解处理器,而 Kotlin 中注解处理工具为 Kotlin Annotatino processing tool(kapt)。

build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' // 使用 kapt 注解处理工具

...

dependencies {
    compile "com.google.dagger:dagger:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"    // kapt 代替 annotationProcessor
}

Inject 注解

  • 标记目标类构造函数,以此为 Component 提供依赖实例
// 标注 constructor 构造方法
class Car @Inject constructor() { .. }

class Car {
    @Inject constructor(name: String)
}
  • 标注成员属性,确定需要注入的依赖
// 标注 setter
class Man {
    lateinit var car: Car
        @Inject set
}

直接标注属性@Inject lateinit var car: Car,编译时会报错

Module 和 Component

Module 和 Component 的写法和 Java 一样,只是 Kotlin 语法不一样

@Module
class CarModule {
    @Provides
    fun provideCar() = Car()
}

@Component(modules = arrayOf(CarModule::class))
interface ManComponent {
    fun inject(man: Man)
}

Scope 作用域

自定义的作用域的语法也变了,下面是常见的两个自定义 Scope:

// 主要是注解的声明语法不同
@Scope
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
annotation class ActivityScope

@Scope
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
annotation class FragmentScope

总结

kapt 编译时生成的代码和之前一样,Component 的使用方式没有改变,需要注意就是 Inject 标注成员属性时,需要标注 setter。

如果想看更具体的代码,可以前往我开源的 Gank - kotlin 项目:https://github.com/JohnnyShieh/Gank/tree/kotlin

到这里,Dagger 2 完全解析系列就结束了,有什么疑问欢迎在下面留言。



作者:JohnnyShieh
链接:https://www.jianshu.com/p/fbacd083a365
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(Java技术)