关于android:Android注解三大框架DaggerHilt-和-Koin-有何不同

37次阅读

共计 2034 个字符,预计需要花费 6 分钟才能阅读完成。

Dagger 和 Koin 无疑是 Android 中最风行的两个依赖注入框架。这两个库具备雷同的用处,而且看起来十分类似,但它们在底层的工作形式却十分不同。

那么 Hilt 是什么呢?Hilt 是一个外部应用 Dagger 的库,只是简化了它的用法,因而我在这里所说的无关 Dagger 的内容也实用于 Hilt。在本文中,我不会告诉您应该抉择哪个库。相同,我想向您展现它们的本质区别 以及这些差别对您的利用造成的影响。

Dagger

如果咱们心愿 Dagger 提供某个类的实例,咱们要做的就是在构造函数中增加 @Inject 注解。

增加这个注解后,Dagger 会在构建时为这个类生成一个 Factory。在该用例下,因为它的类名是 CompositeAdapter, 它会生成一个名为 CompositeAdapter**_**Factory的类。

此类蕴含创立 CompositeAdapter 类的实例所需的所有信息。

如你所看到该工厂类实现了 get() 并返回了一个新的 CompositeAdapter 实例。这实际上是此类实现的 Provider <T> 接口中指定的办法。其余类能够应用 Provider<T> 接口来获取一个类的实例。

如果咱们用 Hilt 代替 Dagger 呢?

在这个例子中,没有任何区别。Hilt 是一个外部应用 Dagger 的库,我向你展现的类是由 Dagger 生成的。如果您应用 Hilt,它的确为咱们生成了一些额定的类,这些类简化了 Dagger 的应用,并缩小了咱们须要编写的样板代码的数量。但外围局部放弃不变。

Koin

Koin 与 Dagger 以及 Hilt 相比,治理依赖项的办法齐全不同。要在 Koin 中注册依赖项,咱们不会应用任何注解,因为 Koin 不会生成任何代码。相同,咱们必须为模块提供工厂,这些模块将用于创立我的项目中所需的每个类的实例。

Koin 将这些工厂类的援用增加到 InstancesRegistry 类中,该类蕴含对咱们编写的所有工厂的援用。

该 map 中的 key 是类的全名或应用命名参数时提供的名称。对应的值是咱们编写的工厂,将用于创立类的实例。

要取得依赖关系,咱们须要调用 get() (比方在一个工厂类中) 或者通过在 activities 或 fragments 中调用 inject() 委托属性,从而懒加载 get()get()办法将查找为给定类型的类注册工厂,并将其注入其中。

有什么影响?

Dagger 生成代码来提供依赖,而 Koin 不生成代码,这实际上带来了一些影响。

1. 错误处理

因为Dagger 是一个编译时依赖注入框架,如果咱们遗记提供某些依赖,咱们简直会立刻晓得咱们的谬误,因为咱们的我的项目将构建失败。

例如,如果咱们遗记向构造函数的 CompositeAdapter 中增加 @Inject 注解,并尝试将其注入 fragment 中,则构建将失败,并显示适当的谬误,确切地通知咱们出了什么问题。

在 Koin 中的状况有所不同,因为它不会生成任何代码。如果咱们遗记为 CompositeAdapter 类增加工厂,利用将会胜利构建,然而会抛出 RuntimeException 一旦咱们申请获取这个类的实例。它可能会在利用启动时产生,因而咱们可能会立刻留神到它,但也可能稍后在其余屏幕上或当用户执行某些特定操作时产生。

2. 对构建工夫的影响

Koin 不生成任何代码的长处是:它对咱们的构建工夫的影响要小得多Dagger 须要应用注解处理器来扫描代码并生成适当的类。这可能须要一些工夫,可能会减慢咱们的构建。

3. 对运行时性能的影响

从另一方面来说,因为 Koin 在运行时解析依赖项,所以它的运行时性能稍差一些。

到底相差多少呢?为了估算性能差别咱们能够应用该库,其中 Rafa Vázquez 基于不同的设施上测量并比拟了这两个库。测试数据的编写形式能够模仿多个级别的传递依赖关系,因而它不仅仅是具备 4 个类的虚构应用程序。

如您所见,Dagger 对启动性能简直没有影响。另一方面,在 Koin 中,咱们能够看到它破费了很多工夫。在 Dagger 中注入依赖也比在 Koin 中快一些。

总结

正如我在本文开始时所说的,我这里的指标不是告诉您要应用哪个库。我在两个不同的大我的项目中都应用了 Koin 和 Dagger。诚实说,我认为抉择 Dagger 还是 Koin 并不重要,重要的是可能让你编写洁净、简略且易于单元测试的代码。我认为所有的库:Koin,Dagger 和 Hilt 都达到了这个目标。

所有这些库都有本人的劣势,我心愿理解它们在底层是如何工作的,可能帮忙您本人决定哪种库最适宜您的利用。

Android 高级开发零碎进阶笔记、最新面试温习笔记 PDF,我的 GitHub

文末

您的点赞珍藏就是对我最大的激励!
欢送关注我,分享 Android 干货,交换 Android 技术。
对文章有何见解,或者有何技术问题,欢送在评论区一起留言探讨!

正文完
 0