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



相关文章
|
2月前
|
存储 前端开发 安全
Spring框架: 解释一下Spring框架的核心概念。
Spring框架: 解释一下Spring框架的核心概念。
51 1
|
2月前
|
缓存 前端开发 Java
【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory
【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory
|
11月前
|
Java Android开发 Kotlin
Hilt原理分析一(Hilt技术概览)
Hilt原理分析一(Hilt技术概览)
|
Android开发
Dagger Hilt - ViewModel的依赖注入及实现原理
Dagger Hilt VIewModel 依赖注入的原理
417 0
|
XML Java 数据格式
Spring 源码阅读 47:在 XML 配置中开启 AOP 特性的原理分析
本文分析了 Spring 通过 XML 配置开启 AOP 特性支持的原理,包括对注解配置切面的支持和直接在 XML 文件中配置切面的支持。
104 0
Spring 源码阅读 47:在 XML 配置中开启 AOP 特性的原理分析
|
Java 程序员 网络安全
spring4.1.8扩展实战之五:改变bean的定义(BeanFactoryPostProcessor接口)
通过自定义BeanFactoryPostProcessor接口的实现类,来对bean实例做一些控制
266 0
spring4.1.8扩展实战之五:改变bean的定义(BeanFactoryPostProcessor接口)
|
XML Java 程序员
spring4.1.8初始化源码学习三部曲之三:AbstractApplicationContext.refresh方法
《spring4.1.8初始化源码学习三部曲》系列的终篇,重点是学习AbstractApplicationContext类的refresh()方法
spring4.1.8初始化源码学习三部曲之三:AbstractApplicationContext.refresh方法
|
前端开发 Android开发 开发者
Dagger Hilt - Android官方推荐的依赖注入框架
Dagger Hilt 帮助 Android 项目实现依赖注入
537 0
|
监控 Java 编译器
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
230 0
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
|
Java Spring
Spring原理学习系列之五:IOC原理之Bean加载
其实很多同学都想通过阅读框架的源码以汲取框架设计思想以及编程营养,Spring框架其实就是个很好的框架源码学习对象。我们都知道Bean是Spring框架的最小操作单元,Spring框架通过对于Bean的统一管理实现其IOC以及AOP等核心的框架功能,那么Spring框架是如何把Bean加载到环境中来进行管理的呢?本文将围绕这个话题进行详细的阐述,并配合Spring框架的源码解析。
Spring原理学习系列之五:IOC原理之Bean加载