Android Hilt 入门教程_注解汇总

一 @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)用于 在类内部自动注入依赖对象 ,通常用于 ActivityFragmentViewModel,因为它们的实例是由 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!"
    }
}

📌 关键点

  1. @Inject lateinit var someClass: SomeClass
    • 让 Hilt 自动创建 SomeClass 实例,并注入到 someClass 变量中
    • 不需要 new SomeClass()
  2. @AndroidEntryPoint 必须加在 ActivityFragment ,否则 Hilt 无法注入
    • 这是因为 ActivityFragment 由 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

作用

  • 用于 ActivityFragmentService,让它们支持 Hilt 依赖注入
  • 必须加 ,否则 Hilt 无法注入对象

✅ 示例

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var someClass: SomeClass  // 自动注入
}

🚀 关键点

ActivityFragmentService 必须加 ,否则 @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 必须配合 @AndroidEntryPointActivityFragment

ViewModel 不用手动创建,Hilt 自动管理


📌 9. @EntryPoint

作用

  • 用于无法使用 @AndroidEntryPoint 的类
  • ContentProviderBroadcastReceiver

✅ 示例

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 ActivityFragmentService 支持 Hilt
@Inject 构造函数注入 & 字段注入
@Module + @InstallIn 提供无法 @Inject 的依赖
@Provides 直接提供实例(如第三方库)
@Binds 绑定接口实现(比 @Provides 高效)
@Singleton 作用域管理(全局单例)
@HiltViewModel Hilt ViewModel 支持
@EntryPoint 用于 BroadcastReceiverContentProvider

🚀 总结 :Hilt 通过 @Inject@Module@Provides 等注解,让 对象创建 & 生命周期管理 自动化,大幅减少样板代码,提高可维护性!

相关推荐
峰哥的Android进阶之路2 小时前
Android的binder机制理解
android·binder
弥巷2 小时前
【Android】Android内存缓存LruCache与DiskLruCache的使用及实现原理
android·java
fool_hungry3 小时前
Android MotionEvent ACTION_OUTSIDE 详细解释
android
下位子4 小时前
『OpenGL学习滤镜相机』- Day8: 多重纹理与混合
android·opengl
TeleostNaCl4 小时前
解决在 Android 使用 hierynomus/smbj 库时上传和下载文件较慢的问题
android·经验分享
峰哥的Android进阶之路4 小时前
handler机制原理面试总结
android·面试
雨白4 小时前
让代码更清晰:Android 中的 MVC、MVP 与 MVVM
android·mvc·mvvm
魑魅魍魉都是鬼5 小时前
不练不熟,不写就忘 之 compose 之 动画之 animateSizeAsState动画练习
android·compose
一只柠檬新5 小时前
当AI开始读源码,调Bug这件事彻底变了
android·人工智能·ai编程