返回

Android依赖注入框架Hilt之“限定符”的作用

Android

Android Jetpack依赖注入框架Hilt提供了名为“限定符”(Qualifier)的机制,可用于为依赖项创建特定类型的标识符。这些标识符的作用是让Hilt能够分辨同类型的依赖项,以便提供正确的实例。限定符在以下情况下非常有用:

  • 解决构造函数注入限制: 对于无法在构造函数中使用@Inject注解的类,可以使用限定符来提供实例。
  • 指定生命周期: 限定符可以指定依赖项的生命周期,从而控制何时创建和销毁实例。
  • 引用权限: 对于需要限制对依赖项访问权限的类,可以使用限定符来控制访问权限。

限定符的类型

Hilt提供了两种类型的限定符:

  1. @Named: 用于根据名称标识依赖项。
  2. @Qualifier: 自定义注解,用于创建自定义标识符。

使用限定符

使用@Named

@Named限定符可以通过在依赖项的字段或方法上使用@Named注解来使用:

@Named("MyQualifier")
private lateinit var myDependency: MyDependency

然后,可以使用限定符名称来获取依赖项:

@Inject
fun injectMyDependency(@Named("MyQualifier") myDependency: MyDependency) {
    // Use the dependency
}

使用自定义限定符

自定义限定符通过创建自定义注解并使用@Qualifier注解来标识它们:

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class MyQualifier

然后,可以将自定义限定符应用于依赖项的字段或方法:

@MyQualifier
private lateinit var myDependency: MyDependency

获取依赖项时,可以使用限定符注解:

@Inject
fun injectMyDependency(@MyQualifier myDependency: MyDependency) {
    // Use the dependency
}

Hilt提供的默认限定符

Hilt还提供了一些默认限定符:

  • @ApplicationContext:限定符,表示该依赖项与应用程序上下文相关联。
  • @ActivityContext:限定符,表示该依赖项与活动上下文相关联。
  • @FragmentContext:限定符,表示该依赖项与片段上下文相关联。
  • @ServiceContext:限定符,表示该依赖项与服务上下文相关联。
  • @ViewModelContext:限定符,表示该依赖项与视图模型上下文相关联。

结论

限定符是Hilt中一种强大的工具,可用于创建特定类型的依赖项标识符。这对于解决构造函数注入限制、指定生命周期和控制引用权限非常有用。通过有效利用限定符,开发人员可以编写更模块化和可维护的Android代码。