Kotlin main函数场景下如何实现Dagger依赖注入调用类方法
Kotlin + Dagger 命令行入口依赖注入解决方案
问题根因
JVM要求程序入口main方法必须是静态方法,你当前写在普通类中的非静态main方法不符合运行要求。Kotlin实现静态方法除了用object结构外,还有更适配当前场景的方案,不需要强行往object中注入依赖即可解决冲突。
推荐实现方案
方案1:使用Kotlin顶级main函数(Kotlin 1.3及以上版本支持,首选)
Kotlin的顶级函数会自动编译为JVM静态方法,完全满足入口要求,你可以直接将main函数定义在类外部,在静态入口中创建普通类实例后完成Dagger注入即可:
class Runner { @Inject lateinit var s3FileOperationsAdapter: S3FileOperationsAdapter fun exec() { s3FileOperationsAdapter.readFunction() } } // 顶级main函数,自动编译为JVM静态入口 fun main(args: Array<String>) { // 初始化你自己定义的Dagger组件 val appComponent = DaggerYourAppComponent.create() val runner = Runner() // 向普通Runner实例注入依赖,完全符合Dagger注入规则 appComponent.inject(runner) // 执行业务逻辑 runner.exec() }
方案2:使用带@JvmStatic注解的伴生对象方法
如果你需要把入口方法封装在类内部,可以在伴生对象的main方法上添加@JvmStatic注解,编译器会将其生成宿主类的静态方法:
class Runner { @Inject lateinit var s3FileOperationsAdapter: S3FileOperationsAdapter fun exec() { s3FileOperationsAdapter.readFunction() } companion object { @JvmStatic fun main(args: Array<String>) { val appComponent = DaggerYourAppComponent.create() val runner = Runner() appComponent.inject(runner) runner.exec() } } }
核心逻辑说明
- 不需要把业务逻辑和注入字段定义在静态结构中,仅需要入口方法满足静态要求即可
- 在静态入口中创建普通类的实例再完成Dagger注入,是Kotlin命令行项目的标准实现方式,不存在兼容性问题
内容的提问来源于stack exchange,提问作者Piyush Doke
相关产品推荐
相关产品推荐

