安卓中的Hilt

Hilt 依赖注入详解

什么是依赖注入?

依赖注入(Dependency Injection, DI)是一种设计模式,它的核心思想是:一个类所依赖的对象,不由自己创建,而是由外部提供
这样做可以降低耦合度、方便测试和扩展。


手动依赖注入

比如我们有一个 UserRepository,需要 ApiService

1
2
3
4
5
6
7
class ApiService {
fun fetchData() = "Data from API"
}

class UserRepository(private val apiService: ApiService) {
fun getUserData() = apiService.fetchData()
}

如果我们要在 ViewModel 使用它:

1
2
3
class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
fun loadData() = userRepository.getUserData()
}

然后在 Activity 中:

1
2
3
val apiService = ApiService()
val userRepository = UserRepository(apiService)
val viewModel = MyViewModel(userRepository)

这里就是手动依赖注入。

缺点:

  1. 依赖链复杂时要手动一层一层传入。
  2. 生命周期管理麻烦(比如 Retrofit 想要全局单例)。
  3. 测试替换实现麻烦。
  4. 随着项目变大,Activity/Fragment 的构造越来越复杂。

Hilt 的出现

Hilt 是 Google 官方推荐的依赖注入框架,基于 Dagger。它解决了:

  • 自动创建依赖对象。
  • 自动管理作用域(如单例,全局作用域,ViewModel 生命周期等)。
  • 自动注入对象到需要的地方。
  • 支持测试时快速替换依赖。

一句话总结:
你只需要声明依赖关系,Hilt 会帮你完成对象的创建和传递。


@Inject constructor

当你在类的构造函数前写上 @Inject

1
2
3
class ApiService @Inject constructor(
private val retrofit: Retrofit
)

它的意思是:

  1. 告诉 Hilt:这个类可以自动构建。
  2. 它需要的依赖(Retrofit)请 Hilt 提供。

Hilt 如何知道传什么?

Retrofit 并不是我们自己写的类,所以 Hilt 不会自动知道怎么创建它。
这时我们需要用 @Provides 来告诉 Hilt:

1
2
3
4
5
6
7
8
9
10
11
12
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.example.com")
.build()
}
}

这样,Hilt 在创建 ApiService 时:

  1. 看到 @Inject constructor
  2. 发现它需要 Retrofit
  3. 找到 provideRetrofit() 提供的 Retrofit
  4. 自动注入并创建 ApiService

在 ViewModel 中使用

1
2
3
4
5
6
7
8
9
@HiltViewModel
class MyViewModel @Inject constructor(
private val apiService: ApiService
) : ViewModel() {

fun loadData() {
// apiService 已经由 Hilt 自动注入
}
}

Activity 中:

1
2
3
4
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels()
}

这时 viewModel 自动拥有完整依赖链:

1
Retrofit -> ApiService -> ViewModel -> Activity

疑问与解答

❓ 手动传入依赖的方式有什么缺点?

  • 依赖链长时很麻烦:例如 ViewModel -> Repository -> ApiService -> Retrofit,每一层都要自己创建。
  • 单例不好管理:想让 Retrofit 在全局只创建一次,就得手动写单例模式。
  • 测试替换困难:想用 FakeRepository 替换真实的 Repository,要修改调用处。

❓ Hilt 如何解决这些?

  • Hilt 会 递归解析依赖链,自动完成实例化。
  • Hilt 有内置的 作用域管理(例如 @Singleton)。
  • 测试时只需要在 Hilt Module 里替换绑定的实现类,而不用改业务代码。

📌 总结

  • 手动依赖注入:简单直观,但依赖链一长就很繁琐。
  • Hilt:自动化依赖注入框架,帮你创建和管理依赖,降低耦合,方便测试,是 Google 官方推荐方案。

  • Copyrights © 2023-2025 Hexo

请我喝杯咖啡吧~

支付宝
微信