首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hilt:为什么ApplicationComponent作用域中的一个类要创建两次?

Hilt 是一种基于 Dagger 的依赖注入框架,旨在简化在 Android 应用程序中使用依赖注入的过程。在 Hilt 中,ApplicationComponent 是一个特殊的组件,它负责创建全局单例的对象,并将它们提供给其他组件或类使用。

在 Hilt 中,ApplicationComponent 的作用域是整个应用程序的生命周期。它的创建和销毁与应用程序的生命周期保持一致。为了确保全局单例的对象在整个应用程序中是唯一的,Hilt 需要在运行时创建两个 ApplicationComponent 类的实例。

第一个实例是用于存储全局单例的对象。这些对象可以通过使用 @Singleton 注解的类来标记。当 Hilt 创建该实例时,它会创建一个持久的、全局的对象图,以确保这些对象的唯一性和一致性。

第二个实例是用于在应用程序的不同部分之间创建依赖关系的。这个实例在每个使用 Hilt 的组件或类之间是独立的。它负责创建每个组件或类自己的依赖关系图,并确保它们的对象是唯一的。

通过创建两个 ApplicationComponent 实例,Hilt 可以将全局单例对象与特定组件或类的依赖关系解耦开来。这样,当一个组件或类需要使用全局单例对象时,它可以通过依赖注入直接获取,而不必担心对象的创建和销毁。

总结一下,为了保证全局单例对象的唯一性,并将其与特定组件或类的依赖关系解耦,Hilt 在 ApplicationComponent 作用域中创建两个类的实例。第一个实例存储全局单例对象,第二个实例用于创建依赖关系。这种设计可以简化依赖注入的过程,并提供更好的代码可读性和可维护性。

腾讯云提供了适用于移动开发的云计算服务,如腾讯移动直播(https://cloud.tencent.com/product/mlvb)、腾讯移动推送(https://cloud.tencent.com/product/tpns)和腾讯移动短信(https://cloud.tencent.com/product/sms)。这些服务可以帮助开发者在移动应用中集成音视频、消息推送和短信功能,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

上手指南 | Jetpack Hilt 依赖注入框架

Jetpck Dagger-Hilt 依赖注入是什么 一个里面有一个变量,这个变量就是这个依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。...Hilt 是什么 ​ Hilt 是 Android 依赖注入库,其实是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造。 ​ Hilt 创建了一组标准 组件和作用域。...Hilt 中组件生命周期 Hilt 会根据相应 Android 生命周期自动创建和销毁组件实例,对应关系如下: Hilt 提供组件 创建对应生命周期 结束对应生命周期 作用范围 ApplicationComponent...使用了 @Module ,相当于是一个模块,常用于创建依赖对象(如,Okhttp,Retrofit 等)。...Hilt 好处 降低 Android 开发者使用依赖注入框架上手成本 内部有一套标准组件和作用域,对范围进行声明后,只能使用在指定作用域中使用这个,并且提供声明周期管理,会自动释放不在使用对象

1.7K20

Jetpack Hilt 依赖注入框架上手指南

可以说 Hilt 是专门为 Andorid 打造Hilt 创建了一组标准 组件和作用域。这些组件会自动集成到 Android 程序中生命周期中。...Hilt 不支持中执行依赖注入,在这种情况下可以使用 @EntryPoint 注解进行创建Hilt 会提供相应依赖。...Hilt 中组件生命周期 Hilt 会根据相应 Android 生命周期自动创建和销毁组件实例,对应关系如下: Hilt 提供组件 创建对应生命周期 结束对应生命周期 作用范围 ApplicationComponent...使用了 @Module ,相当于是一个模块,常用于创建依赖对象(如,Okhttp,Retrofit 等)。...Hilt 好处 降低 Android 开发者使用依赖注入框架上手成本 内部有一套标准组件和作用域,对范围进行声明后,只能使用在指定作用域中使用这个,并且提供声明周期管理,会自动释放不在使用对象

1.5K20
  • 上手指南 | Jetpack Hilt 依赖注入框架

    Jetpck Dagger-Hilt 依赖注入是什么 一个里面有一个变量,这个变量就是这个依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。...Hilt 是什么 ​ Hilt 是 Android 依赖注入库,其实是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造。 ​ Hilt 创建了一组标准 组件和作用域。...---- Hilt 中组件生命周期 Hilt 会根据相应 Android 生命周期自动创建和销毁组件实例,对应关系如下: Hilt 提供组件 创建对应生命周期 结束对应生命周期 作用范围...使用了 @Module ,相当于是一个模块,常用于创建依赖对象(如,Okhttp,Retrofit 等)。...undefined Hilt 好处 降低 Android 开发者使用依赖注入框架上手成本 内部有一套标准组件和作用域,对范围进行声明后,只能使用在指定作用域中使用这个,并且提供声明周期管理,会自动释放不在使用对象

    1.6K30

    在 Android 和 Hilt 中限定作用

    您可以使用 @Singleton 注解将该类型作用域限定为 ApplicationComponent (ApplicationComponent 是一个被整个应用生命周期管理容器)。...在 Android 中限定作用域 看了上文定义,您可能会有这样异议: 在某个特定中使用一个类型实例变量也可以做到限定该变量类型作用域。没错!...如果另一个出于某种原因需要访问这个被限定了作用变量,每次访问也会获得相同实例。...当新 MyActivity 实例被创建时 (如系统设置改变),一个 AnalyticsAdapter 实例将会被创建。...点击查看 全部可用作用域。回到我们最初示例,将作用域限定为 ApplicationComponent,等同于不使用 DI 框架时在 Application 中持有该实例。

    1.4K20

    Hilt-依赖注入框架上手指南

    @AndroidEntryPoint 其会创建一个依赖容器,该容器遵循Android生命周期 @Inject 用来注入字段,其类型不能为Private 如果告诉 Hilt 如何提供相应类型实例...,需要将 @Inject 添加到注入构造函数中。...,也就是说,每次绑定时,都会创建一个绑定实例; 但是,Dagger 允许绑定作用域到特定组件,如上表所示,在指定组件范围内,实例都只会创建一次,并且对该绑定所有请求都将共享同一实例。...对于Hilt可以注入每个Android,都有一个关联 Hilt Component,例如,Application 容器与之关联 ApplicationComponent ,并且Fragmenet容器与关联...我们创建一个BookModule,并使用 @Model 注明这是一个模块,@InstallIn 声明这个模块生命范围为APP级别 @InstallIn(ApplicationComponent::class

    1.7K10

    为什么创建一个不能被实例化

    摄影:产品经理 感谢小何上等牛肉 当我们创建一个Python 并初始化时,一般代码这样写: class People: def __init__(self, name): self.name...一个不能被初始化,有什么用? 这就要引入我们今天讨论一种设计模式——混入(Mixins)。 Python 由于多继承原因,可能会出现钻石继承[1]又叫菱形继承。...为了保留多继承优点,但又摒除缺点,于是有了混入这种编程模式。 Mixins 是一个 Python ,它只有方法,没有状态,不应该被初始化。它只能作为父被继承。...每个 Mixins 只有一个或者少数几个方法。不同 Mixin 方法互不重叠。...但是 在写 Mixins 时候,我们不会写__init__方法,也不会写类属性。并且 Mixin 方法看起来更像是工具方法。 我们可以写很多个 Mixin ,然后用一个子类去继承他们。

    3.4K10

    Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

    我觉得如果只是向大家讲解Hilt用法倒还算是简单,但是如果想要让大家弄明白为什么要使用Hilt?或者再进一步,为什么要使用依赖注入?这就不是一个非常好写的话题了。...假如Engine字段是一个普通,使用这种写法当然是没问题。但问题是Engine是一个接口,Hilt肯定是无法知道如何创建这个接口实例,因此这样写一定会报错。...首先我们定义一个抽象函数,为什么是抽象函数呢?因为我们并不需实现具体函数体。 其次,这个抽象函数函数名叫什么都无所谓,你也不会调用它,不过起个好点名字可以有助于你阅读和理解。...Hilt一共内置了7种组件类型,分别用于注入到不同场景,如下表所示。 ? 这张表中,每个组件作用范围都不相同。其中,ApplicationComponent提供依赖注入实例可以在全项目中使用。...::class) class NetworkModule { ... } 另外和Hilt内置组件相关,还有一个叫组件作用概念,我们也要学习一下它作用

    2.6K30

    Hilt三问—你了解依赖注入吗

    所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个框架——Hilt,今天一起来看看: 依赖注入是啥?为什么需要她? Hilt是啥,怎么用? Hilt支持哪些依赖注入。 依赖注入是啥?...为什么需要她? 简单说,依赖注入就是内部在外部实例化了。也就是不需要自己去做实例化工作了,而是交给外部容器来完成,最后注入到调用者这边,形成依赖注入。...Hilt是啥,怎么用? 很明显,Hilt就是一个依赖注入库,一个封装了Dagger,在Dagger基础上进行构建一个依赖注入库。...2)如果是需要注入第三方依赖,可以使用@Module注解,使用 @Module注解普通,在其中创建第三方依赖对象。...用于创建依赖对象 @InstallIn。

    1.2K00

    Android MVVM框架搭建(十)Hilt、ViewBinding、Activity Result API

    Hilt 应用 在使用Hilt时候会有一些常用注解,有一些是必不可少,所有使用 Hilt 应用都必须包含一个带有 @HiltAndroidApp 注释 Application 。...果然是有问题,我以为是我配置问题,然后我重新创建一个项目这样操作了一下发现没有问题,那么就应该是我项目中其他配置导致Hilt出问题,通过排查最终定位到Room上,修改appbuild.gradle...很简单,举个例子 我在我项目是有这个MMKV使用,一个是库初始化和工具初始化,这里我是直接写在BaseApplicationonCreate中,那么使用Hilt怎么做呢?...表示这是一个全局单例,它对应作用域是ApplicationComponent,可以参考下图 这些内容你刚开始不熟悉很正常,多用就知道了。...是会更简单,但是你需要先熟悉这种用法。 由于我们是一个页面上请求三个不同权限,那么就是注册同一个结果处理器,在不同时候请求不同权限,那么首先创建一个变量。

    1.9K30

    Kotlin 中使用 Hilt 开发实践

    而上述这两点并不互斥,而且在很多情况下,您既可以注入依赖项同时也包含依赖。 使依赖项可注入 如果需要在 Hilt 中使某个变得可注入,您需要告诉 Hilt 如何创建该类实例。...Hilt 模块 就好像 "菜谱",它可以告诉 Hilt 如何创建那些不具备构造函数实例,比如接口或者系统服务。 此外,在您测试中,任何模块都可以被其它模块所替代。...一个典型例子就是 activity,它是由 Android 框架内部创建,而不是由 Hilt 创建。 这些类属于 Hilt 依赖图谱 入口点,而且 Hilt 需要知道这些包含注入依赖。...详情请查看 将任意转换为入口点。 ViewModel ViewModel 是一个特例: 因为框架会创建它们,它既不是被直接实例化,也不是 Android 入口点。...,Hilt 在每个 activity 实例中仅创建一个 OatMilk 实例。

    1.1K30

    WPF Dispatcher 为什么创建一个隐藏窗口?

    然而 C 不满足于只看到这个结论,他更期望知道为什么 WPF 一定要创建这个隐藏窗口。其实对这个问题我也不知道答案,但在和他深入探讨以及不断寻找资料过程中,我们逐渐得知了缘由。...虽然不能正面证明前面 WPF 创建隐藏消息窗口必要性,但可以知道这至少是一个常用做法。既然常用,那一定有其存在必要性。...看起来这是在描述一个现象:如果我们不使用隐藏消息窗口而是直接将消息发给线程,那么此消息将在线程处于模态时丢失。可是,为什么会丢失呢?...设想,有一个开发者在处理某条消息时候自己创建一个消息循环(即嵌套消息循环),那么那个开发者必须在自己消息循环里调用一下 Invoke 中那些操作,否则那些操作将没有任何机会被执行!...而开发者们为什么自己去开消息循环呢?这不就是众所周知“模态”吗???弹模态对话框本质就是开了一个消息循环处理消息同时,阻塞原来消息循环。

    27020

    Android--Hilt入门

    谷歌接管Dagger后,推出了自己Hilt框架,Hilt基于Dagger做了一层封装,大大简化了Dagger使用,定制了一系列规范,并支持Jetpack中部分组件,是一个专门为安卓开发DI框架 一...,此插件是利用Javassist,将编译后将@AndroidEntryPoint注解Activity继承至自己生成 下面是该例子生成Hilt_MainActivity: public abstract...Hilt定义子组件作用域在dagger.hilt.android.scopes包下 这些作用域都是和子组件一一对应,组件层级关系如下图: 组件-作用域层级关系 3.模块中使用作用Hilt...ViewModelComponent是新出子组件,对应作用域为ViewModelScope,作用为:一个ViewModel中多个同类型注入对象,则使用同一份实例。...,并且有它实现,那么Hilt也可以注入生成该接口。

    1.5K20

    kotlin--综合运用Hilt、Paging3、Flow、Room、Retrofit、Coil等实现MVVM架构

    注入 Hilt注解释义: @HiltAndroidApp:触发Hilt代码生成 @AndroidEntryPoint:创建一个依赖容器,该容器遵循Android生命周期 @Module:告诉...Application @InstallIn(ApplicationComponent::class) @Module object RetrofitModule { } 提供一个方法给Hilt...1.根据接口和接口返回json数据,分别创建API和实体 api地址:ikds.do?...注入数据库模块 1.Room相关基 使用Room数据库,首先创建Entity,这边加了一个页码字段: @Entity data class MovieEntity( @PrimaryKey...注入数据库模块 数据库模块同样需要伴随应用生命周期,所以还是和Application绑定 提供方法给Hilt获取AppDatabase、MovieDao @InstallIn(ApplicationComponent

    3.5K31

    从 Dagger 到 Hilt,谷歌为何执着于让我们用依赖注入?

    一个里有两个变量,这两个变量就是它依赖: ? 初始化一个依赖,有两种方法:第一,你这个自己初始化: ? 第二,让外部帮你初始化。 其中这第二种,让外部帮你初始化你依赖,就叫依赖注入。...它不是从里到外全新开发,而是基于 Dagger 做,它下层还是 Dagger。 为什么不直接去优化改进 Dagger,而要基于它做一个新库呢?...这不只是一个「美观」差别,依赖注入可以让你程序更加灵活,比如如果你 View 可以在多个不同 Activity 里显示,那你在 View 里面怎么强转?你转成谁? ? 很麻烦,是吧?...除了共享对象,不共享也可以用依赖注入方式来进行初始化,因为依赖注入作用除了对共享对象提供一致性支持,也可以让我们在创建任何对象时候省一些思考和力气: @Inject newUser: User...加载方式可以选择直接调用构造函数: ? 或者指定子类或实现: ? 或者干脆给出具体代码: ? 加载作用域可以选择默认每次都初始化,也可以设置成全局单例: ?

    1.4K20

    Android Hilt实战初体验: Dagger替换成Hilt

    Hilt 在Dagger 基础上构建而成,因而能够具有 Dagger 编译时正确性、运行时性能、可伸缩性。 那么有的小伙伴可能会有疑问,既然已经有了Dagger那为什么还要Hilt呢?...Hilt与Dagger主要目标都是一致: 简化 Android 应用 Dagger 相关基础架构。 创建一组标准组件和作用域,以简化设置、提高可读性以及在应用之间共享代码。...:hilt-android-compiler:2.28-alpha" } Application 使用Dagger时,需要一个AppComponent单例组件,项目中其它SubComponent都将依赖于它...虽然自定义ViewModelFactory是公用,但是对于不同ViewModel还是手动定义不同bindViewModel方法。...例如上面的MainVM,使用Hilt效果如下 class MainVM @ViewModelInject constructor() : BaseVM() { ... } 至于Hilt为什么会这么简单呢

    1.7K20

    Android Compose 新闻App(二)ViewModel、Hlit、数据流

    下面来使用它们吧 一、添加依赖 添加依赖有两个部分,一个Hilt一个是ViewModel。 ① 添加Hilt依赖   首先是在项目的build.gradle中,先定义Hilt版本。...二、Hilt使用   使用Hilt第一步就是添加@HiltAndroidApp注解, 这里App在上一篇文章中就已经写好了。...= viewModel()) { } 你会觉得很奇怪,这里说明一下,这里就是Compose和ViewModel组合了,为什么这么说呢?   ...只要是可组合函数都可以调用viewModel() 函数去获取ViewModel,而我们这里就是MainViewModel,viewModel() 会返回一个现有的 ViewModel,或在给定作用域内创建一个...这里作用域很重要,因为普通函数如果没有作用域的话是无法调用可组合函数。 四、数据流 Compose 随附了一些扩展程序,它们适用于最热门基于流 Android 解决方案。

    1.4K40

    Hilt 测试最佳实践 | MAD Skills

    Hilt 测试理念 由于 Hilt一个有特定处理原则框架,所以它测试 API 是基于一些特定目标创建。了解 Hilt 用于测试方法有助于您使用和理解它 API。...手动实例化 (测试时不使用 Hilt) 让我们通过一个例子来了解为什么在测试中手动实例化对象会导致模拟对象过度使用。 在下面的代码中,我们对含有一些依赖项 EventManager 进行测试。...TestInstallIn/UninstallModules 影响构建速度原因 对于每个用于测试不同模块组,Hilt 需要创建一组新组件。...而由于 TestInstallIn 作用于全局,所以它会加入一组组件默认集合,而该集合可以在多个测试中共享。...△ 尽可能将测试组织到依赖库 Gradle 模块中 组织 Hilt 模块 时刻记得考虑如何组织您 Hilt,这也有助于您编写测试。

    83810

    Hilt 实战 | 创建应用级别 CoroutineScope

    在遵循 协程最佳实践 时,您可能需要在某些中注入应用级别作用 CoroutineScope,以便可以创建与应用生命周期相同新协程,或创建在调用者作用域之外仍可以工作新协程。...通过本文,您将学习如何通过 Hilt 创建应用级别作用 CoroutineScope,以及如何将其作为依赖项进行注入。...手动依赖项注入 在不使用任何库情况下,遵循依赖项注入 (DI) 最佳实践方案来 手动 创建一个应用级别作用 CoroutineScope,通常会在 Application 中添加一个 CoroutineScope...手动注入更优雅做法是创建一个 ApplicationContainer 容器来持有应用级别作用类型。...在您应用中配置 Hilt 并且创建 Application 容器,可以在 Application 中使用 @HiltAndroidApp 注解。

    1K10

    Hilt 扩展 | MAD Skills

    然后,配置 WorkerManager 使用该 factory,从而使 worker 依赖项注入可用。 Hilt 聚合 启用扩展一个关键机制是 Hilt 能够从路径中发现模块和入口点。...△ 注解处理示意图 由于循环机制,处理器可以相互作用。这非常重要,因为这使得 Hilt 注解处理器可以处理由其他处理器生成 @Module 或 @EntryPoint 。...举个例子,如果每一个实现特定接口都必须创建一个具有多绑定模块,那么可以创建一个扩展,只需在实现上添加注解即可生成多重绑定模块。...当添加一个通用未限定作用绑定时,定义绑定模块可以在其 @InstallIn 中包含两个组件,也可以加载在父组件中,通常是单例组件。...但是当绑定被限定作用域时,模块必须被复制,因为需要不同限定符。实现一个扩展就可以生成两个模块,可以避免样板代码并确保不会遗漏通用绑定。

    80310
    领券