模型
使用时候的问题
1、单例 必须的在全局定义
2、component 不允许同时注册2个类。需要把2个合并到一个component中,代码如下
第二个注入的类需要修改之前的注入方式
下面是2个component合并
类中的使用
合并后不要单独用他们的注解@Singleton单例模式,自己定义注解实现单利如下
3、编译很耗时
4、多个相同注解用 @Named
5、支持懒加载类
lazy(单例)
provider<A>
6、注入都写到 di包下面(规范不强制)
Hilt介绍
无需编写大量的Component代码
Scope也会与Component自动绑定
目前支持以下类(如果其他类注入需要用到dagger2):
Application、Activity、Fragment、View、Service、BroadcastReceiver
组件生命周期
相应的作用域
原理:编译时期 gradle会执行app/intermediates/transforms/ 包下面,通过注解的类,生成对应的Hilt_xxx。然后通过字节码插庄修改当前的类继承Hilt_xxx在oncreate中再次引用了dagger2的代码,进行ioc注入。
字节码插庄的插件的路径:C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\com.google.dagger\hilt-android-gradle-plugin\2.28-alpha\eb33a043b2bbdc7cdee3c851d0f8532bfd3645a5\hilt-android-gradle-plugin-2.28-alpha-
如果使用kotlin最好使用Koin框架:轻量级的依赖注入框架,无代理,无代码生成,无反射
Hilt 和 Koin 进行全方面的分析:
1、AndroidStudio 支持 Hilt 在关联代码间进行导航,支持在 @Inject 修饰的构造器、@Binds 或者@Provides 修饰的方法、限定符之间进行跳转。
2、项目结构:完成 Hilt 的依赖注入需要的文件往往多于 Koin。
3、代码行数:使用 Statistic 工具来进行代码统计,反复对比了项目编译前和编译后,Hilt 生成的代码多于 Koin,随着项目越来越复杂,生成的代码量会越来越多。
4、编译时间:Hilt 编译时间总是大于 Koin,这个结果告诉我们,如果是在一个非常大型的项目,这个代价是非常昂贵。