一 @Inject注解
@Inject 是 Hilt 依赖注入的核心注解,它的作用是 让 Hilt 知道如何创建和提供一个类的实例 ,从而 自动管理对象的依赖关系 。提到的两种使用方式(构造函数注入 和 字段注入 )确实是 @Inject 的两个关键用途,下面详细解释。
📌 1. @Inject 作用之一:构造函数注入
构造函数注入(Constructor Injection)用于 告诉 Hilt 如何创建一个类的实例 。当一个类的构造函数上加上 @Inject,Hilt 就会自动知道如何实例化它。
✅ 示例
kotlin
class SomeClass @Inject constructor() {
fun doSomething() = "Hello Hilt!"
}
@Inject constructor()告诉 Hilt 这个类可以被自动创建 ,无需手动new SomeClass()- 任何需要
SomeClass的地方,Hilt 都可以自动提供它 - 适用于 无状态类(即不需要复杂的初始化)
🚀 使用 @Inject 的优势
✅ 无需手动 new 对象 ,Hilt 负责实例化
✅ 减少样板代码 ,避免工厂模式(Factory)或手写依赖注入
✅ 保证依赖一致性 ,不会意外创建多个 SomeClass 实例
📌 2. @Inject 作用之二:字段注入
字段注入(Field Injection)用于 在类内部自动注入依赖对象 ,通常用于 Activity、Fragment 或 ViewModel,因为它们的实例是由 Android 框架创建的,不能使用构造函数注入。
✅ 示例
kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var someClass: SomeClass // 自动注入
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 使用被 Hilt 自动注入的对象
Log.d("HiltExample", someClass.doSomething()) // 输出 "Hello Hilt!"
}
}
📌 关键点
@Inject lateinit var someClass: SomeClass- 让 Hilt 自动创建
SomeClass实例,并注入到someClass变量中 - 不需要
new SomeClass()
- 让 Hilt 自动创建
@AndroidEntryPoint必须加在Activity或Fragment上 ,否则 Hilt 无法注入- 这是因为
Activity和Fragment由 Android 框架管理,Hilt 需要特殊处理它们的依赖注入
- 这是因为
🚀 使用 @Inject 的优势
✅ Hilt 自动创建并注入实例 ,无需手动初始化
✅ 避免 lateinit 为空的问题 ,Hilt 负责对象生命周期
✅ 简化依赖管理,代码更清晰、可维护性更强
📌 3. @Inject 与 Hilt 作用域
不同的 @Inject 依赖可以拥有不同的生命周期
kotlin
@Singleton
class SomeSingletonClass @Inject constructor()
- 这个
SomeSingletonClass只会被创建一次,整个应用生命周期都能共享 - Hilt 自动管理它的生命周期,不会意外地创建多个实例
不同作用域示例:
kotlin
@ActivityScoped
class SomeActivityScopedClass @Inject constructor()
ActivityScoped:每个 Activity 会有自己的实例SingletonComponent:全局单例ViewModelScoped:与 ViewModel 生命周期一致
📌 4. @Inject 不能用于接口,需要 @Module 提供
如果 @Inject 用在 接口 上,会报错:
kotlin
interface ApiService {
fun fetchData(): String
}
❌ 直接 @Inject 不行:
kotlin
class ApiServiceImpl @Inject constructor() : ApiService {
override fun fetchData() = "API Data"
}
👉 必须使用 @Module 提供接口实例
kotlin
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideApiService(): ApiService {
return ApiServiceImpl()
}
}
📌 关键点
- 如果是普通类,
@Inject constructor()就够了 - 如果是接口,必须用
@Module和@Provides提供
🎯 结论
| 方式 | 使用场景 | 作用 |
|---|---|---|
@Inject constructor() |
普通类 | 让 Hilt 知道如何创建这个类 |
@Inject lateinit var |
Activity、Fragment、ViewModel | 让 Hilt 自动注入对象实例 |
@Module + @Provides |
接口或第三方库 | 让 Hilt 提供无法直接 @Inject 的对象 |
🚀 一句话总结
@Inject让 Hilt 知道如何创建对象,而@Inject lateinit var让 Hilt 自动注入对象!
二 Hilt其他注解
在 Android Hilt 中,除了 @Inject 之外,还有多个核心注解,它们负责不同的依赖注入功能,包括作用域管理、模块提供依赖、绑定接口、生命周期管理等。以下是 Hilt 的核心注解及其详细解析,并附上代码示例。
📌 1. @HiltAndroidApp
作用:
- 标记
Application类,让 Hilt 生成依赖注入的代码 - 必须 在
Application类上使用
✅ 示例
kotlin
@HiltAndroidApp
class MyApplication : Application()
🚀 关键点
✅ Hilt 会在应用启动时初始化依赖注入
✅ 生成 Hilt_MyApplication 代码,Hilt 依赖的入口
✅ 必须加,否则 Hilt 无法工作
📌 2. @AndroidEntryPoint
作用:
- 用于
Activity、Fragment、Service等,让它们支持 Hilt 依赖注入 - 必须加 ,否则 Hilt 无法注入对象
✅ 示例
kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var someClass: SomeClass // 自动注入
}
🚀 关键点
✅ Activity、Fragment、Service 必须加 ,否则 @Inject 不会生效
✅ Hilt 会自动在内部生成依赖注入代码
✅ Fragment 依赖的 Activity 也必须有 @AndroidEntryPoint,否则会崩溃
📌 3. @Inject
作用:
- 用于 构造函数 或 字段,让 Hilt 知道如何创建和注入对象
✅ 示例
构造函数注入
kotlin
class SomeClass @Inject constructor() {
fun doSomething() = "Hello Hilt!"
}
字段注入
kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var someClass: SomeClass
}
🚀 关键点
✅ 构造函数上加 @Inject,Hilt 知道如何创建对象
✅ 字段加 @Inject,Hilt 会自动提供依赖
📌 4. @Module + @InstallIn
作用:
- 提供无法直接
@Inject的对象(如接口、第三方库) - 定义依赖的作用域
✅ 示例
kotlin
@Module
@InstallIn(SingletonComponent::class) // 全局单例
object AppModule {
@Provides
@Singleton
fun provideApiService(): ApiService {
return Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
🚀 关键点
✅ @Module 让 Hilt 知道这里提供依赖
✅ @InstallIn 确定依赖的作用域(SingletonComponent 表示全局单例)
📌 5. @Provides
作用:
- 提供对象实例 (适用于无法
@Inject的情况,如第三方库)
✅ 示例
kotlin
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideSomeClass(): SomeClass {
return SomeClass()
}
}
🚀 关键点
✅ 如果 SomeClass 不能 @Inject,就用 @Provides 提供
✅ 返回类型就是 Hilt 提供的类型
📌 6. @Binds
作用:
- 用于接口的实现绑定
- 比
@Provides更高效(少了一次方法调用)
✅ 示例
kotlin
interface ApiService {
fun fetchData(): String
}
class ApiServiceImpl @Inject constructor() : ApiService {
override fun fetchData() = "API Data"
}
@Module
@InstallIn(SingletonComponent::class)
abstract class AppModule {
@Binds
abstract fun bindApiService(impl: ApiServiceImpl): ApiService
}
🚀 关键点
✅ @Binds 只能用于 abstract 方法,不能有逻辑
✅ 比 @Provides 更高效,但 @Provides 更灵活
📌 7. 作用域注解
作用:
- 控制 对象的生命周期,防止重复创建
- 适用于
@Provides或@Inject提供的对象
✅ 示例
kotlin
@Singleton
class SomeSingletonClass @Inject constructor()
| 作用域 | 适用范围 | 生命周期 |
|---|---|---|
SingletonComponent |
全局 | 应用生命周期 |
ActivityRetainedComponent |
ViewModel | Activity 重新创建时依然存在 |
ActivityComponent |
Activity | Activity 销毁时释放 |
FragmentComponent |
Fragment | Fragment 销毁时释放 |
📌 8. @HiltViewModel
作用:
- 让 ViewModel 支持 Hilt 注入
- 简化 ViewModel 创建
✅ 示例
kotlin
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: MyRepository
) : ViewModel()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
}
🚀 关键点
✅ @HiltViewModel 必须配合 @AndroidEntryPoint 的 Activity 或 Fragment
✅ ViewModel 不用手动创建,Hilt 自动管理
📌 9. @EntryPoint
作用:
- 用于无法使用
@AndroidEntryPoint的类 - 如
ContentProvider、BroadcastReceiver
✅ 示例
kotlin
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
fun getSomeClass(): SomeClass
}
// 使用 EntryPoint
val someClass = EntryPointAccessors
.fromApplication(context, MyEntryPoint::class.java)
.getSomeClass()
🚀 关键点
✅ 适用于无法直接 @Inject 的情况
✅ Hilt 依然能提供依赖
🎯 结论
| 注解 | 作用 |
|---|---|
@HiltAndroidApp |
让 Hilt 初始化依赖注入(必须加在 Application) |
@AndroidEntryPoint |
让 Activity、Fragment、Service 支持 Hilt |
@Inject |
构造函数注入 & 字段注入 |
@Module + @InstallIn |
提供无法 @Inject 的依赖 |
@Provides |
直接提供实例(如第三方库) |
@Binds |
绑定接口实现(比 @Provides 高效) |
@Singleton |
作用域管理(全局单例) |
@HiltViewModel |
Hilt ViewModel 支持 |
@EntryPoint |
用于 BroadcastReceiver、ContentProvider |
🚀 总结 :Hilt 通过 @Inject、@Module、@Provides 等注解,让 对象创建 & 生命周期管理 自动化,大幅减少样板代码,提高可维护性!