Android 依赖注入框架详解
Android 依赖注入框架详解
主流依赖注入框架对比
框架 | 维护者 | 特点 | 适用场景 |
---|---|---|---|
Dagger/Hilt | 编译时生成代码,高性能,学习曲线陡峭 | 中大型项目,需要高性能DI | |
Koin | Kotlin 社区 | 纯 Kotlin,DSL 配置,运行时依赖解析,简单易用 | 中小型项目,Kotlin 纯项目 |
Kodein | Open Source | Kotlin 友好,多平台支持,灵活的配置方式 | Kotlin 多平台项目 |
Anko | JetBrains | 已废弃,原为 Kotlin Android 扩展的一部分 | 不推荐新项目使用 |
ButterKnife | Jake Wharton | 视图绑定库(非完整DI),已废弃 | 仅视图绑定,不推荐新项目使用 |
1. Dagger/Hilt (推荐)
Dagger 核心特点
- 编译时依赖解析:在编译时生成代码,运行时无反射
- 高性能:生成的代码直接执行,无运行时开销
- 强类型:编译时检查依赖关系,提前发现问题
Hilt 对 Dagger 的增强
- 简化配置:预定义组件和作用域
- 与 Android 深度集成:
- 自动提供
Application
、Activity
等内置组件 - 内置
@HiltViewModel
支持
- 自动提供
- 减少模板代码:自动生成部分 Dagger 模块
基本使用示例
1. 添加依赖
// build.gradle (app)
plugins {id 'kotlin-kapt'id 'com.google.dagger.hilt.android'
}dependencies {implementation "com.google.dagger:hilt-android:2.44"kapt "com.google.dagger:hilt-compiler:2.44"
}// 启用 Hilt 的增量处理
kapt {correctErrorTypes true
}
2. 定义依赖项
// 定义可注入的依赖
class AnalyticsAdapter @Inject constructor(private val service: AnalyticsService
) { /*...*/ }// 使用模块提供接口实现
@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {@Bindsabstract fun bindAnalyticsService(impl: AnalyticsServiceImpl): AnalyticsService
}
3. 在 Android 组件中使用
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {@Inject lateinit var analytics: AnalyticsAdapteroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)analytics.track("Activity Created")}
}
2. Koin (轻量级替代方案)
核心特点
- 纯 Kotlin 实现:使用 Kotlin DSL 配置
- 运行时依赖解析:使用小型代理工厂和反射
- 简单易用:学习曲线平缓
- 适合中小项目:对性能要求不苛刻的场景
基本使用示例
1. 添加依赖
dependencies {// Koin 核心implementation "io.insert-koin:koin-android:3.4.0"// 如需 ViewModel 支持implementation "io.insert-koin:koin-androidx-viewmodel:3.4.0"
}
2. 配置 Koin 模块
val appModule = module {// 单例实例single<AnalyticsService> { AnalyticsServiceImpl() }// 工厂模式(每次获取新实例)factory { AnalyticsAdapter(get()) }// ViewModel 注入viewModel { MainViewModel(get()) }
}
3. 启动 Koin
class MyApp : Application() {override fun onCreate() {super.onCreate()startKoin {androidContext(this@MyApp)modules(appModule)}}
}
4. 注入依赖
class MainActivity : AppCompatActivity() {// 懒注入private val analytics: AnalyticsAdapter by inject()// 直接注入private val viewModel: MainViewModel by viewModel()
}
3. Kodein (多平台支持)
核心特点
- Kotlin 多平台支持:可跨 Android、iOS、后端等使用
- 多种绑定方式:非常灵活的依赖配置
- 性能中等:介于 Dagger 和 Koin 之间
基本使用示例
1. 添加依赖
dependencies {implementation "org.kodein.di:kodein-di:7.18.0"implementation "org.kodein.di:kodein-di-framework-android-x:7.18.0"
}
2. 配置 Kodein
val kodein = Kodein {bind<AnalyticsService>() with singleton { AnalyticsServiceImpl() }bind<AnalyticsAdapter>() with provider { AnalyticsAdapter(instance()) }
}
3. 在 Android 中使用
class MainActivity : AppCompatActivity(), KodeinAware {override val kodein by closestKodein()private val analytics: AnalyticsAdapter by instance()
}
选择建议
- 新项目/大型项目:优先考虑 Hilt (官方维护,性能最佳)
- 中小型 Kotlin 项目:可以选择 Koin (简单易用)
- 多平台项目:考虑 Kodein (跨平台支持)
- 已废弃方案:避免使用 ButterKnife、Anko 等
高级主题
作用域管理
- Hilt:预定义
@Singleton
、@ActivityScoped
等作用域 - Koin:使用
scope
定义自定义作用域 - 生命周期感知:自动清理与组件生命周期绑定的依赖
测试支持
- Hilt:提供
@UninstallModules
和@HiltAndroidTest
- Koin:使用
checkModules
验证模块,支持测试模块覆盖
性能比较
- 初始化时间:Hilt (编译时) > Kodein > Koin
- 运行时性能:Hilt > Kodein > Koin
- 内存占用:Hilt < Kodein < Koin
与架构组件集成
- ViewModel 注入:各框架都提供专门支持
- WorkManager 注入:Hilt 提供原生支持
- Compose 集成:均可通过
@Composable
函数访问依赖
选择适合项目的 DI 框架可以显著提高代码的可维护性和可测试性,建议根据项目规模、团队熟悉度和性能需求做出选择。