当前位置: 首页 > news >正文

Hilt在android项目中使用的注解说明

Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。执行手动依赖项注入要求您手动构造每个类及其依赖项,并借助容器重复使用和管理依赖项。

Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期,提供了一种在应用中使用 DI(依赖项注入)的标准方法。Hilt 在热门 DI 库 Dagger 的基础上构建而成,因而能够受益于 Dagger 的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。

1、Hilt注解

2、Hilt注解说明

  1. @HiltAndroidApp 注解

    • 代码:@HiltAndroidApp class MyApplication : Application() { ... }
    • 解释:@HiltAndroidApp用于启动 Hilt 的代码生成流程,它必须被添加到Application类上。这个注解为被标注的 Android 类添加一个依赖注入(DI)容器,不过要实现这一功能,需要在项目中应用 Hilt 的 Gradle 插件。
  2. @AndroidEntryPoint 注解

    • 标记Activity@AndroidEntryPoint class MyActivity : AppCompatActivity() { ... },该注解用于标记Activity类,使得 Hilt 能够为其提供依赖注入支持。
    • 构造函数注入:在class AnalyticsAdapter @Inject constructor(private val service: AnalyticsService ) { ... }中,@Inject用于构造函数注入,它指定了创建AnalyticsAdapter实例时使用的构造函数,同时表明AnalyticsAdapter依赖于AnalyticsService
    • 字段注入:@Inject @AndroidEntryPoint class MyActivity : AppCompatActivity() { @Inject lateinit var adapter: AnalyticsAdapter展示了字段注入的用法。在使用@AndroidEntryPoint注解的类中,@Inject注解用于填充类中的字段,但这些字段不能是私有的。
  3. @HiltViewModel 注解

    • 代码:@HiltViewModel class MyViewModel @Inject constructor( private val adapter: AnalyticsAdapter, private val state: SavedStateHandle ): ViewModel() { ... }
    • 解释:@HiltViewModel用于告知 Hilt 如何创建和提供架构组件ViewModel的实例。通过构造函数注入,MyViewModel获得了它所依赖的adapterstate
  4. @Module 和 @InstallIn 注解

    • @Module@InstallIn(SingletonComponent::class) @Module class AnalyticsModule { ... }中的@Module注解用于标记一个类,在这个类中可以为那些无法通过构造函数进行依赖注入的类型添加绑定关系。
    • @InstallIn@InstallIn(SingletonComponent::class)用于指定在哪个由 Hilt 生成的 DI 容器(这里是SingletonComponent)中,AnalyticsModule模块的绑定必须是可用的。
  5. @Provides 注解

    • 代码:@Provides fun providesAnalyticsService( converterFactory: GsonConverterFactory ): AnalyticsService { return Retrofit.Builder()... }
    • 解释:@Provides用于为不能通过构造函数注入的类型(此处为AnalyticsService)添加绑定。方法的返回类型就是要绑定的类型,参数则是其依赖项。如果该类型没有作用域限定,每次需要获取该类型的实例时,都会执行函数体来创建实例。
  6. @Binds 注解

    • 代码:@Binds abstract fun bindsAnalyticsService( analyticsServiceImpl: AnalyticsServiceImpl ): AnalyticsService
    • 解释:@Binds是绑定接口类型的简写方式。它只能在使用@Module注解的类中使用,且使用@Binds注解的方法必须是抽象的。方法的返回类型是要绑定的接口类型,参数是接口的实现类型。
  7. 作用域注解(@Singleton 和 @ActivityScoped

    • @Singleton:在@Singleton class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... }中,@SingletonAnalyticsAdapter对象限定在一个容器的作用域内。这意味着在整个应用中,当把AnalyticsAdapter作为依赖项、进行字段注入,或者更低层级的容器需要它时,容器提供的都是同一个AnalyticsAdapter实例。
    • @ActivityScoped:同样是作用域注解,它将对象的作用域限定在 Activity 级别,不过文档中未详细展开其具体用法,通常表示在一个 Activity 的生命周期内,被标注类型的实例是唯一的。
  8. 限定符注解(@ApplicationContext 和 @ActivityContext

    • @ApplicationContext:在@Singleton class AnalyticsAdapter @Inject constructor( @ApplicationContext val context: Context private val service: AnalyticsService ) { ... }中,@ApplicationContext是一个预定义的限定符注解,用于指定context依赖的具体类型,确保在注入时提供正确的上下文实例。
    • @ActivityContext:也是预定义的限定符注解,用于在相应的容器中指定与 Activity 相关的上下文依赖,文档中未详细说明其使用场景,但通常与 Activity 的特定上下文相关。
  9. @EntryPoint 注解

    • 代码:在class MyContentProvider(): ContentProvider类中,@InstallIn(SingletonComponent::class) @EntryPoint interface MyContentProviderEntryPoint { fun analyticsService(): AnalyticsService
    • 解释:@EntryPoint用于在那些不直接支持 Hilt 或无法使用 Hilt 的类(如ContentProvider)中获取依赖项。使用@EntryPoint注解的接口必须同时使用@InstallIn注解,并传入从中获取依赖项的 Hilt 预定义组件。在MyContentProviderquery方法中,通过EntryPointAccessors.fromApplication方法获取analyticsService实例。

3、Hilt注解总结

一、注解基础

Hilt 基于 Dagger,为 Android 提供依赖注入支持,使用多种注解简化开发,提高代码可维护性。

二、主要注解及用法

(一)应用级注解

  1. @HiltAndroidApp:标注在Application类上,启动 Hilt 代码生成,为该类添加 DI 容器,使用时需配置 Hilt 的 Gradle 插件。
  2. @AndroidEntryPoint:用于标记ActivityFragment等组件,配合@Inject实现依赖注入,支持构造函数和字段注入,字段注入时字段不能私有。

(二)ViewModel 注解

@HiltViewModel:用于ViewModel类,结合构造函数中的@Inject,告知 Hilt 如何创建和提供ViewModel实例。

(三)模块相关注解

  1. @Module:标记的类用于为无法通过构造函数注入的类型添加绑定。
  2. @InstallIn:指定模块绑定在哪个 Hilt 生成的 DI 容器中可用,如@InstallIn(SingletonComponent::class)
  3. @Provides:在@Module类中,为不能构造注入的类型创建绑定,返回类型为绑定类型,参数为依赖项,无作用域时每次需实例则执行函数体。
  4. @Binds:绑定接口类型的简写,在@Module类中,方法需抽象,返回接口类型,参数为实现类型。

(四)作用域注解

  1. @Singleton:使同一类型实例在容器中作为依赖、字段注入或层级下级容器使用时保持一致。
  2. @ActivityScoped:限定实例在 Activity 范围内唯一,保证特定场景下实例的一致性和资源合理利用。

(五)限定符注解

  1. @ApplicationContext:获取应用上下文依赖,如在AnalyticsAdapter构造函数中用于指定Context类型。
  2. @ActivityContext:获取 Activity 上下文依赖,在与 Activity 紧密相关的依赖注入场景中使用。

(六)特殊场景注解

@EntryPoint:用于不直接支持 Hilt 或无法使用 Hilt 的类获取依赖。注解的接口需同时用@InstallIn指定组件,通过EntryPointAccessors获取绑定。

4、官方地址

Hilt 和 Dagger 注解备忘单  |  App architecture  |  Android Developers

http://www.xdnf.cn/news/941887.html

相关文章:

  • 设置QDialog的setModal(true)对show()无法阻塞
  • Python 训练营打卡 Day 46
  • 力扣-131.分割回文串
  • 基于fpga的疲劳驾驶检测
  • 【Autosar COM】Marvell 88Q5050 以太网交换机驱动技术解析
  • JavaScript 的意义
  • 山东大学项目实训——基于DeepSeek的智能写作与训练平台(十二)
  • cpp自学 day26(智能指针)
  • 基于算法竞赛的c++编程(23)原码,反码,补码
  • 《双指针》题集
  • [特殊字符]01Linux基础入门教程——从起源到核心概念
  • 高等数学 | 第八章-向量值函数的积分与场论
  • JavaScript 语法结构
  • MySQL 索引失效:六大场景与原理剖析
  • 官网Numpy教程
  • leetcode.多数元素
  • 【PhysUnits】17.1 补充数值后量纲系统实现解析 (dimension.rs)
  • 一键压缩图片工具
  • 2000-2020年各省第三产业增加值占GDP比重数据
  • 网络安全基础
  • Python 调用 C 程序时输出顺序错乱问题分析与解决
  • 0x-2-Oracle Linux 9上安装JDK配置环境变量
  • 第五讲 基础IO
  • Go切片与映射的内存优化技巧:实战经验与最佳实践
  • 【LeetCode】算法详解#6 ---除自身以外数组的乘积
  • JUC并发编程(六)CAS无锁实现/原子整数/原子引用/原子数组/字段更新
  • Python训练营---DAY48
  • Java线程安全与同步机制全解析
  • 嵌入式学习笔记 - freeRTOS为什么中断中不能使用互斥量
  • 《最短路(Dijkstra+Heap)》题集