第4讲 · 核心注解 — 深入 @HiltAndroidApp 的作用、Application 改造以及 Hilt 组件初始化流程。
⚡ 触发器 @HiltAndroidApp 是 Hilt 依赖注入的应用级入口注解。它标记在 Application 类上,用于:
Hilt_MyApplication 等基类。ApplicationComponent (SingletonComponent) 及其子组件。@AndroidEntryPoint 注入。💡 一句话:@HiltAndroidApp 是 Hilt 在 Android 世界的“总开关”,没有它,Hilt 无法工作。
使用 Hilt 前,需要将自定义 Application 改造为 Hilt 感知的入口。步骤如下:
@HiltAndroidApp 到 Application 类。| 改造前 (传统) | 改造后 (Hilt) |
|---|---|
class MyApp : Application() |
@HiltAndroidApp |
手动创建 Dagger 组件:DaggerAppComponent.create() |
无需手动创建,Hilt 自动生成 Hilt_MyApp 并注入 |
在 onCreate() 中初始化全局单例 |
使用 @Singleton + @Provides 或 @Binds |
// MyApplication.kt
@HiltAndroidApp
class MyApplication : Application() {
// Hilt 会自动生成 Hilt_MyApplication 基类
// 无需覆写 onCreate 进行手动依赖初始化
}
注意:如果项目中使用了多模块,每个模块的 Application 类同样只需添加 @HiltAndroidApp,Hilt 会合并所有模块的组件。
从 @HiltAndroidApp 注解开始,Hilt 在编译期和运行期执行以下步骤:
| 阶段 | 行为 | 关键产出 |
|---|---|---|
| ① 编译期 | APT 处理 @HiltAndroidApp | 生成 Hilt_MyApplication 基类 & 组件工厂 |
| ② 运行时 · 应用启动 | Application.onCreate() 触发 Hilt 初始化 | 创建 SingletonComponent (ApplicationComponent) |
| ③ 组件树构建 | 根据 @AndroidEntryPoint 创建子组件 | ActivityComponent, FragmentComponent 等 |
| ④ 依赖注入 | Hilt 自动注入标记了 @Inject 的字段/构造 | 全局单例、ViewModel、Retrofit 等实例就绪 |
Hilt 根据 Android 生命周期自动管理以下组件(部分):
✅ 所有组件均由 @HiltAndroidApp 触发的根组件 SingletonComponent 提供。
// MyApplication.kt (使用 Hilt)
@HiltAndroidApp
class MyApplication : Application() {
// 无需额外代码,Hilt 自动处理初始化
}
// 在 AndroidManifest.xml 中声明 (必须)
<application
android:name=".MyApplication"
... />
// 任意 Activity 使用 @AndroidEntryPoint 即可注入
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject lateinit var repository: MyRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// repository 已就绪
}
}