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就实现了依赖注入,那么还用这个类干嘛呢?因为会在其他地方用到,欲知详情,请看下一篇文章。



相关文章
|
存储 监控 安全
吃透synchronized实现原理
吃透synchronized实现原理
359 0
|
Android开发
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
1427 0
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
1164 18
|
Java Spring
Gradle 如何确保依赖的版本兼容性
Gradle 通过依赖管理机制确保版本兼容性,使用声明式配置定义项目依赖,自动解析和下载所需库。它支持版本范围和动态版本,通过冲突解决策略选择最佳版本,保证构建的一致性和可靠性。
1716 3
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文章通过一些问答的模式结合Android主线程(UI线程)的工作原理来讲解,源码注释很全,还有结合流程图,如果你对Android 消息处理机制还不是很理解,我相信只要你静下心来耐心的看,肯定会有不少的收获的。
1215 3
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
Shell Linux C语言
Linux0.11 execve函数(六)
Linux0.11 execve函数(六)
934 1
|
Java 测试技术
[软件自动化测试] selenium java环境配置
介绍了包括选择Gradle构建,关闭Gradle Wrapper的默认下载,修改`gradle-wrapper.properties`以使用腾讯云镜像,以及更新`build.gradle`文件添加国内仓库和Selenium依赖。在测试驱动部分,创建了一个简单的JUnit测试用例,展示了如何初始化Edge浏览器并访问网站。运行测试时可能出现关于CDP版本不匹配的警告,可以通过升级Selenium依赖中的CDP版本来解决。推荐根据[Selenium库网页](https://search.maven.org/search?q=g:org.seleniumhq.selenium)提供的版本信息进行升级
2609 6
|
Android开发 数据格式 XML
Android轻便易用的文件选择器ExFilePicker
 Android轻便易用的文件选择器ExFilePicker 在新版的Android中(如Android 7.0+),文件选择由于权限限制,Uri变化,文件资源路径格式改版等等,变得比较复杂起来,比如,得在Androidmanifest配置FileProvider完了还得写xml目录下的文件path这些等等。
2217 0
|
编译器 API 开发工具
Android compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion
Android compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion
1665 0
|
Kotlin
找不到 kotlinx.android.synthetic***
找不到 kotlinx.android.synthetic***
768 0

热门文章

最新文章