当前位置: 首页 > 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.dtcms.com/a/239257.html

相关文章:

  • MS8911S/8921S/8922M/8931S 是一款具有内部迟滞的高速比较器
  • MCP是啥?技术原理是什么?Windows系统配置MCP,Cursor使用MCP
  • Selenium4+Python的web自动化测试框架
  • 职位竞聘BA商业推理测评管理人员TAS倍智题库天翼云益丰等企业
  • 轻量级数学竖式训练方案解析
  • 并发和并行
  • 操作系统期末版
  • 大模型在蛛网膜下腔出血预测与诊疗方案制定中的应用研究
  • 重复文件管理 一键清理重复 图片 文档 免费 超轻量无广告
  • 在网络排错中,经常会用到的操作命令和其作用
  • 【OpenCV】使用opencv找哈士奇的脸
  • RabbitMQ 各类交换机
  • 从一次日期格式踩坑经历,谈谈接口设计中的“约定大于配置“
  • Razor编程中@符号的全面解析与深度应用指南
  • JavaScript 自定义对象详解
  • Java多线程从入门到精通
  • 【JavaSE】绘图与事件入门学习笔记
  • 【会员专享数据】2017-2024年我国分省的10米精度土地覆盖数据
  • Boost ASIO 库深入学习(2)
  • 【时时三省】(C语言基础)局部变量和全局变量例题
  • 【51单片机】3. 数码管大师
  • 【CUDA 】核函数性能分析工具
  • PLC入门【2】PLC的接线
  • 系统模块与功能设计框架
  • 【Java学习笔记】System类
  • Linux下的进程调度机制
  • 深入理解 Java 的反射、注解与动态代理
  • 2025新高考二卷选择题第一题题解
  • LangChain4j 1.x 核心源码剖析-基础篇
  • 【项目实训项目博客】用户使用手册