一、基础概念
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。
具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。DI
依赖注入框架的优点:
依赖注入库会自动释放不再使用的对象,减少资源的过度使用。
在指定范围内,可重用依赖项和创建的实例,提高代码的可重用性,减少了很多模板代码。
代码变得更具可读性。
易于构建对象。
编写低耦合代码,更容易测试.
Android端常用DI框架
-
Dagger2/Hilt
-
Koin
框架 | 优点 | 缺点 |
---|---|---|
dagger2/Hilt | Google加持,社区广泛,性能佳 | 难上手,编译慢,编译错误晦涩,kotlin、android支持不简洁(代码量大) |
Koin | 易上手、易调试、编译快、代码少,jetpack/Kotiln支持棒 | 性能不及dagger2/Hilt,java兼容不足,社区小 |
...... |
二、Koin的学习使用
依赖包的添加
//1、在project的build.gradle下,buildScript的dependencies添加 classpath
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.koin:koin-gradle-plugin:$koin_version"
}
}
//2、应用koin插件
apply plugin: 'koin'
//3、在各自module的build.gralde 的dependencies添加依赖包
// Koin for Kotlin
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-core-ext:$koin_version"
// Koin for Android
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-scope:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
implementation "org.koin:koin-android-ext:$koin_version"
//koin for Androidx 基本二选一即可
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-fragment:$koin_version"
implementation "org.koin:koin-androidx-ext:$koin_version"
testImplementation "org.koin:koin-test:$koin_version"
1 、简单使用
-
三步走
业务
class
的创建定义
koin
的容器模块module
,内部声明类的创建(单例、工厂等)在
Application
调用stratKoin
内部初始化modules
-
关键函数符号
-
startKoin
-
module
-
single
-
factory
-
viewmodel
-
fragment
-
by inject()/get()
,前者在Android的运行时组件(AFSC)有效 -
by viemwodel()/getViewModel()
-
named()
//限定标示符,string和type -
bind
类似于类型扩展,接口实现,通过get<T>获取,泛型时候,koin.bind(T,instance)来获取,另有getAll()
-
2、使用
-
无参构造,单参数构造
-
多构造函数,需要使用
qualifiers
限定符号 -
single单例的scope,factory是新建对象 的scope,可以自定scope
-
外部参数的构造函数,初始化可用表达式构造如:
(view:View)->ViewInfo(view)
,使用方get/inject时候,接收参数使用parametersOf()
、、最多5个参数 -
普通类使用koin注解,需要实现
KoinComponent
接口 -
跨模块module的使用依旧如是
-
getProperty获取配置file的Property属性,android是androidFileProperties
-
组件化开发中,可使用外部加载 loadKoinModule在startKoin之外操作。
-
Activity/Fragment默认扩展了scope字段
附注:
-
在startKoin中androidLogger注意添加参数Level.error,否则可能报错(这是个bug)
-
使用
by lazy
的时候,注意加载顺序,不要和别人比懒,可能别人比你更懒! -
在module中不要空的函数块
-
多次重复声明某个对象,需要override
-
注意inject/viewmodel等函数符号的导包,别弄错
-
koin适用于android ,java,所以注意区分