Hilt -> Android 专属依赖注入(DI)框架
Hilt 是 Google 基于 Dagger 封装的 Android 专属依赖注入(DI)框架,显著简化了依赖管理流程,提升代码可维护性和可测试性。以下是核心要点及使用指南:
dagger2:
Dagger 2 原理和使用-CSDN博客
Hilt vs Dagger2:Android 依赖注入框架对比-CSDN博客
Hilt 和 AOP(面向切面编程) 关系 -CSDN博客
一、核心概念与优势
-
简化 Dagger 配置
-
自动生成组件和作用域,减少模板代码(如手动创建 Dagger 组件)27。
-
内置 Android 类支持(如
Application
、Activity
),通过注解即可注入依赖38。
-
-
生命周期管理
-
为不同 Android 类预定义组件和作用域(如
SingletonComponent
对应应用全局,ActivityComponent
绑定 Activity 生命周期),自动释放资源。
-
-
与 Jetpack 深度集成
-
支持 ViewModel、Room、WorkManager 等 Jetpack 组件,通过
@HiltViewModel
等注解无缝注入。
-
二、基础使用步骤
-
添加依赖
在项目级build.gradle
中引入插件:
buildscript {dependencies {classpath "com.google.dagger:hilt-android-gradle-plugin:2.44"}
}
在模块级 build.gradle
中启用:
plugins {id 'kotlin-kapt'id 'dagger.hilt.android.plugin'
}
dependencies {implementation "com.google.dagger:hilt-android:2.44"kapt "com.google.dagger:hilt-compiler:2.44"
}
初始化 Hilt
在自定义 Application
类添加注解:
@HiltAndroidApp
class MyApp : Application()
声明依赖提供方式
-
构造函数注入(推荐):
-
class UserRepository @Inject constructor() { ... }
模块注入(用于接口或第三方库):
@Module
@InstallIn(SingletonComponent::class)
object AppModule {@Provides@Singletonfun provideRetrofit(): Retrofit { ... }
}
注入依赖到 Android 类
使用 @AndroidEntryPoint
标记支持类(如 Activity/Fragment),并通过 @Inject
注入字段:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {@Inject lateinit var userRepo: UserRepository
}
三、与 Jetpack 组件集成
-
ViewModel 注入
使用@HiltViewModel
注解,依赖通过构造函数注入:
@HiltViewModel
class MyViewModel @Inject constructor(private val apiService: ApiService
) : ViewModel() { ... }
-
Activity/Fragment 中通过
by viewModels()
获取实例27。 -
Room 数据库注入
通过模块提供 Database 和 Dao 实例:
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {@Provides@Singletonfun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {return Room.databaseBuilder(context, AppDatabase::class.java, "db").build()}
}
:cite[2]
四、作用域与组件对照表
Hilt 通过预定义组件管理依赖生命周期,以下为常用作用域:
作用域注解 | 绑定组件 | 生命周期范围 |
---|---|---|
@Singleton | SingletonComponent | 应用全局 |
@ActivityRetainedScoped | ActivityRetainedComponent | 配置更改后仍存活 |
@ActivityScoped | ActivityComponent | Activity |
@ViewModelScoped | ViewModelComponent | ViewModel |
@FragmentScoped | FragmentComponent | Fragment |
示例:
@ActivityScoped
class AuthManager @Inject constructor() { ... } // 随 Activity 销毁释放
五、常见问题解决
-
注入私有字段报错
Hilt 不支持注入私有字段,需改为public
或protected
3。 -
作用域冲突
确保模块安装的组件(@InstallIn
)与依赖的作用域匹配(如 Activity 级模块不可提供全局单例)4。 -
多模块依赖
编译模块需传递包含所有 Hilt 模块和注入类3。
总结
Hilt 通过标准化 DI 实现,解决了 Android 开发中手动管理依赖的复杂性。其核心价值在于:
-
✅ 降低门槛:无需深入 Dagger 即可实现高效依赖管理。
-
✅ 生命周期安全:自动绑定组件作用域,避免内存泄漏。
-
✅ 生态兼容:深度整合 Jetpack,适合现代 Android 架构。
建议从官方示例入手,逐步实践模块化注入场景。完整文档参考:Hilt 官方指南。