Hilt原理分析二(HIlt如何实现Application的依赖注入)

简介: HIlt如何实现Application的依赖注入

系列文章

在上一篇文章中,我们知道MyApplication添加了@HiltAndroidApp注解后,会生成四个文件

59e974d88da202e94a9e5098668ce80.png

这节就来分析一下这四个文件,了解一下这四个文件的关系及作用,先从Hilt_MyApplication分析,代码如下

b4e32db0a934a39601cf41bb31184c1.png

从Application的入口函数onCreate方法开始分析,可以看到代码很少,只有一句,Hilt_MyApplication类的其他方法也是被这句代码调用的,方法的调用顺序如下

4c4b8b77f01cd39890dfeb6ca8c95fd.png

Hilt_MyApplicationcomponentManager方法中创建了ApplicationComponentManager对象,然后调用了ApplicationComponentManager对象的generatedComponent方法,代码如下

3d4b3e2ee8316b3ee790925c7990db7.png

generatedComponent方法调用后,走到了这里

d97b9530aface9841283bb835d210db.png

这里就走到了生成的4个类的另外一个类DaggerMyApplication_HiltComponents_SingletonC里面。

DaggerMyApplication_HiltComponents_SingletonC方法分析

调用的方法时序如下图

b3b5c7c74ec136e08b7147cc140e2ad.png

至此,Hilt_MyApplication的onCreate方法的

f5cdb18bde8b2771b45170e1c75c8f2.png

红框的部分就分析完了,红框部分执行后返回DaggerMyApplication_HiltComponents_SingletonC对象,然后injectMyApplication方法将Application作为入参传入,injectMyApplication方法的代码如下

a8ac08d136f62f3a817a55974e3e288.png

这里只是一个空方法,看不出来什么,为了能更好的理解Hilt的原理,再在MyApplication类里面增加一些代码,如下

@HiltAndroidApp
class MyApplication : Application() {
    @Inject
    lateinit var applicationModel: ApplicationModel
    override fun onCreate() {
        super.onCreate()
        applicationModel.doSomething()
    }
}

ApplicationModel的代码如下

class ApplicationModel @Inject constructor() {
    fun doSomething() {
        Log.d("wizardev", "doSomething")
    }
}

MyApplication类中新增了成员变量并加了@Inject注解,然后在onCreate方法中直接调用doSometing方法,直接运行程序,打印的Log如下

27c040fe3cfff46fd227b7e5c98325d.png

可以发现,在MyApplication中并没有对applicationModel赋值,但是仍然可以直接调用doSometing方法,那么关于赋值的这部分毫无疑问是Hilt框架帮我们做的,Hilt是怎么做到的呢?仍然要从代码中获取答案。

Hilt是如何实现依赖注入的

直接看编译后代码的变化,如下图

6668b04eba3b964bb7e677e92f53632.png

可以看到编译后新增了两个类,从前文我们知道,MyApplication类没增加新增变量之前,DaggerMyApplication_HiltComponents_SingletonCinjectMyApplication方法是一个空方法,看下新增变量后的injectMyApplication方法,如下

78dda827c02ea2fce27214444747553.png

再看下injectMyApplication2方法,如下

528ceaa2853d5bd10f3b65f7273889e.png

可以发现,最终调用到了新生成的MyApplication_MembersInjector类的injectApplicationModel方法,injectApplicationModel方法的代码如下

058e0a4f7b1d592db0e067e11446569.png

这个方法就是对MyApplication成员变量applicationModel赋值的地方,可以发现这里并没有用到另外一个类—ApplicationModel_Factory就实现了依赖注入,那么还用这个类干嘛呢?因为会在其他地方用到,欲知详情,请看下一篇文章。



相关文章
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
1462 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
消息中间件 存储 Java
MQ核心作用、解耦、削峰使用场景详解
【11月更文挑战第21天】在如今的高并发互联网应用中,如何确保系统在巨大的流量冲击下还能稳定运行,是每个技术团队都会遇到的挑战。说到这,消息队列(MQ)就是背后的“大功臣”了。无论是异步处理请求、平滑应对流量高峰,还是让各个系统模块相互独立不“拖后腿”,MQ都是不可或缺的帮手。那么,MQ是如何削峰的?或者它是如何让复杂系统解耦的?今天,我们就来聊聊MQ的三大核心功能,看它是如何助力系统高效、稳定运转的。
896 1
|
7月前
|
存储 机器学习/深度学习 算法
基于 C++ 的局域网访问控制列表(ACL)实现及局域网限制上网软件算法研究
本文探讨局域网限制上网软件中访问控制列表(ACL)的应用,分析其通过规则匹配管理网络资源访问的核心机制。基于C++实现ACL算法原型,展示其灵活性与安全性。文中强调ACL在企业与教育场景下的重要作用,并提出性能优化及结合机器学习等未来研究方向。
200 4
|
12月前
|
机器学习/深度学习 存储 算法
《匿名化技术:数据隐私与价值挖掘的平衡探索》
在数据驱动的时代,数据成为企业和组织的核心资产,匿名化技术作为保护数据隐私的重要手段备受关注。它通过去除或混淆个人身份信息,如数据脱敏、泛化和加密等方法,有效保护隐私。然而,匿名化可能影响数据的完整性和准确性,进而影响价值挖掘。为平衡隐私保护与数据利用,需明确使用目的、加强数据治理、创新技术应用,确保数据安全合规,推动数字经济健康发展。
706 30
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
680 8
|
算法 调度 UED
深入理解操作系统的进程调度机制
本文旨在探讨操作系统中至关重要的组成部分之一——进程调度机制。通过详细解析进程调度的概念、目的、类型以及实现方式,本文为读者提供了一个全面了解操作系统如何高效管理进程资源的视角。此外,文章还简要介绍了几种常见的进程调度算法,并分析了它们的优缺点,旨在帮助读者更好地理解操作系统内部的复杂性及其对系统性能的影响。
|
安全 编译器 C语言
C语言常量的定义与使用的注意点
在 C 语言中,常量是在程序运行期间值不变的量,通过字面值、`#define` 或 `const` 关键字定义。字面常量直接在代码中表示固定值,如整数 `100`、浮点数 `3.14`、字符 `'A'` 和字符串 `"Hello, World!"`;`#define` 用于定义宏,如 `#define PI 3.14159`;`const` 则定义不可变变量,如 `const int daysInWeek = 7`。常量可用于数组大小、循环边界等场景,并能提升代码的可读性和可维护性。使用时需注意作用域、类型安全和命名,避免直接使用数字(魔法数字)。
|
算法 定位技术
【逻辑设计】卡诺图 | 布尔方程式 | 最小项与最大项 | 卡诺图无关项 Don‘t cares
【逻辑设计】卡诺图 | 布尔方程式 | 最小项与最大项 | 卡诺图无关项 Don‘t cares
1256 0
|
缓存 运维 负载均衡
阿里云云效操作报错合集之在获取Maven私有库配置出错,该如何操作
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
机器学习/深度学习 自然语言处理 自动驾驶
深度学习中的自监督学习:突破数据标注瓶颈的新路径
随着深度学习在各个领域的广泛应用,数据标注的高成本和耗时逐渐成为限制其发展的瓶颈。自监督学习作为一种无需大量人工标注数据的方法,正在引起越来越多的关注。本文探讨了自监督学习的基本原理、经典方法及其在实际应用中的优势与挑战。
817 27

热门文章

最新文章