Dagger2 和 Hilt 都是 Android 上常用的依赖注入(DI)框架,Hilt 实际上是基于 Dagger2 构建的,是 Google 官方推荐的简化版本。下面是两者的详细对比:
核心区别
特性 | Dagger2 | Hilt |
---|---|---|
复杂性 | 配置复杂,需要更多样板代码 | 简化配置,减少样板代码 |
学习曲线 | 陡峭 | 相对平缓 |
与Android集成 | 需要手动处理Android生命周期 | 内置Android组件支持 |
代码生成 | 编译时生成代码 | 同样基于编译时代码生成 |
Google官方支持 | 是 | 是(Dagger的Android专用封装) |
Jetpack集成 | 需要额外配置 | 深度集成Jetpack组件 |
详细对比
1. 初始设置
Dagger2:
Kotlin
// 需要自定义Application类
class MyApp : Application() {
val appComponent: AppComponent by lazy {
DaggerAppComponent.builder()
.application(this)
.build()
}
}
Hilt:
Kotlin
@HiltAndroidApp
class MyApp : Application() // 只需添加注解
2. 组件定义
Dagger2:
Kotlin
@Component(modules = [NetworkModule::class])
interface AppComponent {
fun inject(activity: MainActivity)
}
Hilt:
Kotlin
// 无需显式定义组件,Hilt提供标准组件如@SingletonComponent
@InstallIn(SingletonComponent::class)
@Module
class NetworkModule
3. Activity注入
Dagger2:
Kotlin
class MainActivity : AppCompatActivity() {
@Inject lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
(application as MyApp).appComponent.inject(this)
super.onCreate(savedInstanceState)
// ...
}
}
Hilt:
Kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var viewModel: MyViewModel
// 自动处理注入
}
4. ViewModel注入
Dagger2:
Kotlin
// 需要自定义ViewModelFactory
class MyViewModel @Inject constructor(
private val repository: MyRepository
) : ViewModel()
Hilt:
Kotlin
@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: MyRepository
) : ViewModel()
为什么选择Hilt?
-
简化Android开发:自动处理Android生命周期
-
减少样板代码:无需手动创建Component和Subcomponent
-
标准化实践:提供预定义的组件和作用域
-
更好的Jetpack集成:特别是ViewModel和WorkManager
何时使用Dagger2?
-
需要更精细控制依赖注入流程
-
非Android项目(如纯Kotlin/JVM项目)
-
已有大型项目使用Dagger2且迁移成本高
迁移建议
如果是从头开始新项目,强烈推荐使用Hilt。对于现有Dagger2项目,可以逐步迁移:
-
先添加Hilt依赖
-
新功能使用Hilt实现
-
逐步将旧组件迁移到Hilt
性能考虑
两者在运行时性能上几乎没有差别,因为Hilt本质上仍然是基于Dagger2的代码生成。主要区别在于开发体验和代码可维护性。