Jetpack架构组件库:Hilt

Hilt是Google专为Android开发的依赖注入框架,基于Dagger2,简化了Android应用的依赖注入。本文详细介绍了Hilt的使用方法,包括Hilt的注解、依赖注入Android类、定义Hilt绑定、组件生命周期和作用域,以及Hilt与其他Jetpack库的集成。同时,探讨了依赖注入的优势和潜在缺点,帮助开发者决定何时在项目中使用Hilt。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hilt

Hilt 是基于 Dagger2 的依赖注入框架,Google 团队将其专门为Android开发打造了一种纯注解的使用方式,相比 Dagger2 而言使用起来更加简单。

依赖注入框架的主要作用就是控制反转IOC, Inversion of Control), 那么什么是控制反转呢?

首先它是一种技术思想,而不是一种具体的技术体现。它描述的是:面向对象的开发语言领域中的对象的创建和管理问题。

  • 控制:指的是对象创建(实例化、管理)的权力
  • 反转:将控制权交给外部环境(IOC框架)
  • 传统的开发方式:一个类里面有很多成员变量对象,这些成员对象,都需要new出来
  • IOC思想的开发方式IOC原则:NO,我们不要new,这样耦合度太高(入参改变,所有引用都要改),而是通过IOC容器(如Hilt)来帮助我们实例化对象并赋值。

总结一句话就是:一个类中创建对象是一种控制能力,控制反转就是将这种创建对象的控制权转交给外部框架来自动实现

常见的依赖注入手段:

  • 解决方案一:配置xml文件,里面标明哪个类,用了哪些成员变量,等需要加载这个类的时候,我帮你注入(new)进去。(Spring服务器开发常用IOC方案)
  • 解决方案二:在需要注入的成员变量上添加注解,例如 @Inject,在编译时生成相关的实现类,运行时动态注入。(Android开发中常用的手段是 APT + JavaPoet 或者是 KSP + KotlinPoet)

Hilt 的使用

首先添加依赖项:

首先,将 hilt-android-gradle-plugin 插件添加到项目的根级 build.gradle 文件中:

plugins {
   
  ...
  id 'com.google.dagger.hilt.android' version '2.44' apply false
}

然后,应用 Gradle 插件并在 app/build.gradle 文件中添加以下依赖项:

...
plugins {
   
  id 'kotlin-kapt'
  id 'com.google.dagger.hilt.android'
}

android {
   
  ...
}

dependencies {
   
  implementation "com.google.dagger:hilt-android:2.44"
  kapt "com.google.dagger:hilt-compiler:2.44"
}

// Allow references to generated code
kapt {
   
  correctErrorTypes true
}

Hilt 使用 Java 8 功能。如需在项目中启用 Java 8,请将以下代码添加到 app/build.gradle 文件中:

android {
   
  ...
  compileOptions {
   
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Hilt 注解 Application 类

所有使用 Hilt 的应用都必须包含一个带有 @HiltAndroidApp 注解的 Application 类。

@HiltAndroidApp 会触发 Hilt 的代码生成操作,生成的代码包括应用的一个基类,该基类充当应用级依赖项容器。

在这里插入图片描述

生成的这一 Hilt 组件会附加到 Application 对象的生命周期,并为其提供依赖项。此外,它也是应用的父组件,这意味着,其他组件可以访问它提供的依赖项。

将依赖项注入 Android 类

Application 类中设置了 Hilt 且有了应用级组件后,Hilt 可以为带有 @AndroidEntryPoint 注解的其他 Android 类提供依赖项:

在这里插入图片描述

Hilt 目前支持以下 Android 类:

  • Application(通过使用 @HiltAndroidApp
  • ViewModel(通过使用 @HiltViewModel
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver

如果使用 @AndroidEntryPoint 为某个 Android 类添加注解,则还必须为依赖于该类的 Android 类添加注解。例如,如果您为某个 fragment 添加注解,则还必须为使用该 fragment 的所有 activity 添加注解。

注意:在 HiltAndroid 类的支持方面适用以下几项例外情况:

  • Hilt 仅支持扩展 ComponentActivityactivity,如 AppCompatActivity
  • Hilt 仅支持扩展 androidx.FragmentFragment
  • Hilt 不支持保留的 fragment

@AndroidEntryPoint 会为项目中的每个 Android 类生成一个单独的 Hilt 组件。这些组件可以从它们各自的父类接收依赖项,如组件层次结构中所述。

如需从组件获取依赖项,请使用 @Inject 注解执行字段注入:

在这里插入图片描述

注意:由 Hilt 注入的字段不能为私有字段。尝试使用 Hilt 注入私有字段会导致编译错误。

Hilt 注入的类可以有同样使用注入的其他基类。如果这些类是抽象类,则它们不需要 @AndroidEntryPoint 注解。

如需详细了解 Android 类被注入的是哪个生命周期回调,请参阅组件生命周期。

定义 Hilt 绑定

为了执行字段注入,Hilt 需要知道如何从相应组件提供必要依赖项的实例。“绑定”包含将某个类型的实例作为依赖项提供所需的信息。

Hilt 提供绑定信息的一种方法是构造函数注入。在某个类的构造函数上使用 @Inject 注解,以告知 Hilt 如何提供该类的实例:

在这里插入图片描述

在一个类的代码中,带有注解的构造函数的参数即是该类的依赖项。在本例中,AnalyticsServiceAnalyticsAdapter 的一个依赖项。因此,Hilt 还必须知道如何提供 AnalyticsService 的实例。

注意:在构建时,Hilt 会为 Android 类生成 Dagger 组件。然后,Dagger 会走查您的代码,并执行以下步骤:

  • 构建并验证依赖关系图,确保没有未满足的依赖关系且没有依赖循环。
  • 生成它在运行时用来创建实际对象及其依赖项的类。

Hilt 模块

有时,类型不能通过构造函数注入。发生这种情况可能有多种原因。例如,您不能通过构造函数注入接口。此外,您也不能通过构造函数注入不归您所有的类型,如来自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值