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)用于 在类内部自动注入依赖对象 ,通常用于 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!"
    }
}

📌 关键点

  1. @Inject lateinit var someClass: SomeClass
    • 让 Hilt 自动创建 SomeClass 实例,并注入到 someClass 变量中
    • 不需要 new SomeClass()
  2. @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 等注解,让 对象创建 & 生命周期管理 自动化,大幅减少样板代码,提高可维护性!

相关推荐
警醒与鞭策5 小时前
【无标题】
android·unity·性能优化·游戏引擎·perforce
传奇开心果编程7 小时前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack
李游Leo9 小时前
《HarmonyOS 7 精准碰一碰跨设备协作开发实战》07:异常恢复、状态机与CrossDrop工程收尾【鸿蒙心迹】
android·harmonyos
方白羽12 小时前
Android APK安全防护
android·安全·apk
小黄人软件12 小时前
AndroidStudio老项目 macOS运行BlueTooth蓝牙串口助手(Android+Studio源码).rar
android·macos
00后程序员张12 小时前
苹果App Store上架指南:费用、原理与步骤详解
android·ios·小程序·https·uni-app·iphone·webview
天神哥哥啊12 小时前
cocos联调注意事项-安卓
android
TDengine (老段)12 小时前
TDengine TSDB 实战排障四(升级与兼容)
android·java·大数据·数据库·物联网·时序数据库·tdengine
蓝速科技13 小时前
政务自助终端信创选型与无人值守落地方案
android·大数据·数据库·人工智能·科技·技术分享·政务
硫酸锌0114 小时前
在手机上运行Python增量备份手机数据到PC电脑
android·windows·python