依赖注入框架Koin(一)知识预览

一、基础概念

依赖注入(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 、简单使用

  • 三步走

  1. 业务class的创建

  2. 定义koin的容器模块module,内部声明类的创建(单例、工厂等)

  3. 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、使用

  1. 无参构造,单参数构造

  2. 多构造函数,需要使用qualifiers限定符号

  3. single单例的scope,factory是新建对象 的scope,可以自定scope

  4. 外部参数的构造函数,初始化可用表达式构造如:(view:View)->ViewInfo(view),使用方get/inject时候,接收参数使用parametersOf()、、最多5个参数

  5. 普通类使用koin注解,需要实现KoinComponent接口

  6. 跨模块module的使用依旧如是

  7. getProperty获取配置file的Property属性,android是androidFileProperties

  8. 组件化开发中,可使用外部加载 loadKoinModule在startKoin之外操作。

  9. Activity/Fragment默认扩展了scope字段

附注:

  1. 在startKoin中androidLogger注意添加参数Level.error,否则可能报错(这是个bug)

  2. 使用by lazy的时候,注意加载顺序,不要和别人比懒,可能别人比你更懒!

  3. 在module中不要空的函数块

  4. 多次重复声明某个对象,需要override

  5. 注意inject/viewmodel等函数符号的导包,别弄错

  6. koin适用于android ,java,所以注意区分

上一篇:Docker执行apt-get update报错解决


下一篇:idea导入项目问题:No implementation for org.apache.maven.model.path.PathTranslator was bound.