Hilt在android项目中使用的注解说明
Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。执行手动依赖项注入要求您手动构造每个类及其依赖项,并借助容器重复使用和管理依赖项。
Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期,提供了一种在应用中使用 DI(依赖项注入)的标准方法。Hilt 在热门 DI 库 Dagger 的基础上构建而成,因而能够受益于 Dagger 的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。
1、Hilt注解
2、Hilt注解说明
-
@HiltAndroidApp
注解- 代码:
@HiltAndroidApp class MyApplication : Application() { ... }
- 解释:
@HiltAndroidApp
用于启动 Hilt 的代码生成流程,它必须被添加到Application
类上。这个注解为被标注的 Android 类添加一个依赖注入(DI)容器,不过要实现这一功能,需要在项目中应用 Hilt 的 Gradle 插件。
- 代码:
-
@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
注解用于填充类中的字段,但这些字段不能是私有的。
- 标记
-
@HiltViewModel
注解- 代码:
@HiltViewModel class MyViewModel @Inject constructor( private val adapter: AnalyticsAdapter, private val state: SavedStateHandle ): ViewModel() { ... }
- 解释:
@HiltViewModel
用于告知 Hilt 如何创建和提供架构组件ViewModel
的实例。通过构造函数注入,MyViewModel
获得了它所依赖的adapter
和state
。
- 代码:
-
@Module
和@InstallIn
注解@Module
:@InstallIn(SingletonComponent::class) @Module class AnalyticsModule { ... }
中的@Module
注解用于标记一个类,在这个类中可以为那些无法通过构造函数进行依赖注入的类型添加绑定关系。@InstallIn
:@InstallIn(SingletonComponent::class)
用于指定在哪个由 Hilt 生成的 DI 容器(这里是SingletonComponent
)中,AnalyticsModule
模块的绑定必须是可用的。
-
@Provides
注解- 代码:
@Provides fun providesAnalyticsService( converterFactory: GsonConverterFactory ): AnalyticsService { return Retrofit.Builder()... }
- 解释:
@Provides
用于为不能通过构造函数注入的类型(此处为AnalyticsService
)添加绑定。方法的返回类型就是要绑定的类型,参数则是其依赖项。如果该类型没有作用域限定,每次需要获取该类型的实例时,都会执行函数体来创建实例。
- 代码:
-
@Binds
注解- 代码:
@Binds abstract fun bindsAnalyticsService( analyticsServiceImpl: AnalyticsServiceImpl ): AnalyticsService
- 解释:
@Binds
是绑定接口类型的简写方式。它只能在使用@Module
注解的类中使用,且使用@Binds
注解的方法必须是抽象的。方法的返回类型是要绑定的接口类型,参数是接口的实现类型。
- 代码:
-
作用域注解(
@Singleton
和@ActivityScoped
)@Singleton
:在@Singleton class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... }
中,@Singleton
将AnalyticsAdapter
对象限定在一个容器的作用域内。这意味着在整个应用中,当把AnalyticsAdapter
作为依赖项、进行字段注入,或者更低层级的容器需要它时,容器提供的都是同一个AnalyticsAdapter
实例。@ActivityScoped
:同样是作用域注解,它将对象的作用域限定在 Activity 级别,不过文档中未详细展开其具体用法,通常表示在一个 Activity 的生命周期内,被标注类型的实例是唯一的。
-
限定符注解(
@ApplicationContext
和@ActivityContext
)@ApplicationContext
:在@Singleton class AnalyticsAdapter @Inject constructor( @ApplicationContext val context: Context private val service: AnalyticsService ) { ... }
中,@ApplicationContext
是一个预定义的限定符注解,用于指定context
依赖的具体类型,确保在注入时提供正确的上下文实例。@ActivityContext
:也是预定义的限定符注解,用于在相应的容器中指定与 Activity 相关的上下文依赖,文档中未详细说明其使用场景,但通常与 Activity 的特定上下文相关。
-
@EntryPoint
注解- 代码:在
class MyContentProvider(): ContentProvider
类中,@InstallIn(SingletonComponent::class) @EntryPoint interface MyContentProviderEntryPoint { fun analyticsService(): AnalyticsService
- 解释:
@EntryPoint
用于在那些不直接支持 Hilt 或无法使用 Hilt 的类(如ContentProvider
)中获取依赖项。使用@EntryPoint
注解的接口必须同时使用@InstallIn
注解,并传入从中获取依赖项的 Hilt 预定义组件。在MyContentProvider
的query
方法中,通过EntryPointAccessors.fromApplication
方法获取analyticsService
实例。
- 代码:在
3、Hilt注解总结
一、注解基础
Hilt 基于 Dagger,为 Android 提供依赖注入支持,使用多种注解简化开发,提高代码可维护性。
二、主要注解及用法
(一)应用级注解
- @HiltAndroidApp:标注在
Application
类上,启动 Hilt 代码生成,为该类添加 DI 容器,使用时需配置 Hilt 的 Gradle 插件。 - @AndroidEntryPoint:用于标记
Activity
、Fragment
等组件,配合@Inject
实现依赖注入,支持构造函数和字段注入,字段注入时字段不能私有。
(二)ViewModel 注解
@HiltViewModel:用于ViewModel
类,结合构造函数中的@Inject
,告知 Hilt 如何创建和提供ViewModel
实例。
(三)模块相关注解
- @Module:标记的类用于为无法通过构造函数注入的类型添加绑定。
- @InstallIn:指定模块绑定在哪个 Hilt 生成的 DI 容器中可用,如
@InstallIn(SingletonComponent::class)
。 - @Provides:在
@Module
类中,为不能构造注入的类型创建绑定,返回类型为绑定类型,参数为依赖项,无作用域时每次需实例则执行函数体。 - @Binds:绑定接口类型的简写,在
@Module
类中,方法需抽象,返回接口类型,参数为实现类型。
(四)作用域注解
- @Singleton:使同一类型实例在容器中作为依赖、字段注入或层级下级容器使用时保持一致。
- @ActivityScoped:限定实例在 Activity 范围内唯一,保证特定场景下实例的一致性和资源合理利用。
(五)限定符注解
- @ApplicationContext:获取应用上下文依赖,如在
AnalyticsAdapter
构造函数中用于指定Context
类型。 - @ActivityContext:获取 Activity 上下文依赖,在与 Activity 紧密相关的依赖注入场景中使用。
(六)特殊场景注解
@EntryPoint:用于不直接支持 Hilt 或无法使用 Hilt 的类获取依赖。注解的接口需同时用@InstallIn
指定组件,通过EntryPointAccessors
获取绑定。
4、官方地址
Hilt 和 Dagger 注解备忘单 | App architecture | Android Developers