Hilt vs Dagger2:Android 依赖注入框架对比

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?

  1. 简化Android开发:自动处理Android生命周期

  2. 减少样板代码:无需手动创建Component和Subcomponent

  3. 标准化实践:提供预定义的组件和作用域

  4. 更好的Jetpack集成:特别是ViewModel和WorkManager

何时使用Dagger2?

  1. 需要更精细控制依赖注入流程

  2. 非Android项目(如纯Kotlin/JVM项目)

  3. 已有大型项目使用Dagger2且迁移成本高

迁移建议

如果是从头开始新项目,强烈推荐使用Hilt。对于现有Dagger2项目,可以逐步迁移:

  1. 先添加Hilt依赖

  2. 新功能使用Hilt实现

  3. 逐步将旧组件迁移到Hilt

性能考虑

两者在运行时性能上几乎没有差别,因为Hilt本质上仍然是基于Dagger2的代码生成。主要区别在于开发体验和代码可维护性。