Kotlin依赖注入框架Koin

2023-10-27

一、简介

Koin是一款轻量级的依赖注入框架,它允许Android应用程序轻松管理组件之间的依赖关系。

Koin的主要目标是使依赖注入变得简单,易于理解和使用。它采用纯Kotlin编写,无代理,无需代码生成或反射,而是基于函数式DSL和注解,提供了一个简单而强大的方式来声明和管理依赖项。

以下是 Koin 和 Hilt 的对比表:

功能 Koin Hilt
轻量级
易于使用
可用于 Android、Kotlin Native 和 JavaScript
具有广泛的社区支持
与 Android 生命周期集成
支持自动注入
与 Jetpack 组件集成
具有 Google 的支持

二、使用

1、添加依赖

在build.gradle中添加依赖

//core为Koin的核心
implementation("io.insert-koin:koin-core:3.4.0")
//android是Koin为Android提供的一些扩展方法
implementation("io.insert-koin:koin-android:3.4.0")
//compat是Koin为Android组件提供的一些扩展方法
implementation("io.insert-koin:koin-android-compat:3.4.0")
}

2、注入对象定义

// 定义三个对象:分别是常规对象注入、单例对象注入、ViewModel对象注入

//1、常规对象定义及注入
class NormalKoin {

}
// normalMoudle就是来管理常规的对象注入
val normalModule = module {
    factory { NormalKoin() }
}


//2、单例对象定义及注入
class SingletonKoin {

}
// singleModule则是用来单例对象注入
val singleModule = module {
    single { SingletonKoin () }
}


// 3、有参ViewModel定义及注入
class KoinViewModel(private val repository: Repository): ViewModel() {

}
class Repository() {

}

//注意:有参数的注入,需要先在module中注入参数后,告诉koin它是一个注入对象,然后在注入ViewModel的时候通过get()方法就可以自动获取到。
val viewModelModule = module {
    single { Repository() }
    viewModel { KoinViewModel (get()) }
}


关键方法Koin中Module的方法:
factory :用来注入常规对象(每次使用都会创建新的对象)
single :用来注入单例对象
viewModel:用来注入ViewModel对象

3、开启Koin注入

在Application中开启koin注入

startKoin {
  AndroidLogger(Level.DEBUG)
  androidContext(context)
  modules(
    listOf(
      viewModelModule,
      singleModule,
      normalModule
    )
  )
}

startkoin{}开启Koin功能,然后进行一些配置

  • androidLogger()开启Koin的运行日志
  • androidContext()绑定Application上下文,后面可以直接从Koin中获取
  • module()传入Koin的模块,此模块就是我们定义的依赖注入项

4、注入获取实例

class MainActivity : BaseActivity<ActivityMainBinding>() {

    // 使用Koin进行对象注入
    private val normalKoin : NormalKoin by inject()
    private val singletonKoin: SingletonKoinby inject()
    private val koinViewModel: KoinViewModel by viewModel()

    override fun initViewBinding(): ActivityMainBinding {
        return ActivityMainBinding.inflate(layoutInflater)
    }

    override fun onCreate() {
        super.onCreate()
        
    }
}

Koin不仅可以使用by inject()来注入,也可以直接使用get()来注入一个对象,二者的区别在于一个是懒加载模式,一个是直接获取模式

  • inject():返回的是一个Lazy对象,内部依旧调用的是get()方法
  • get():返回的是需要注入的对象实例

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin依赖注入框架Koin 的相关文章

  • Android 12:如何防止更改手机壁纸时重新启动活动?

    在 Android 12 上 如果我们开启一个活动 进入手机主屏幕更换壁纸 切换回我们的 Activity 该 Activity 重新启动 看起来它与 Material You 主题有关 我想在我的应用程序进入前台时禁用活动的重新启动 有办
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • ImageView 中的全尺寸图像

    我正在尝试在 ImageView 中绘制图像 但我希望它不缩放 并根据需要使用滚动条 我怎样才能做到这一点 现在我只有一个可绘制集作为 XML 中 ImageView 的 android src 这会自动缩放图像以适应屏幕宽度 我读到这可能
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 启动 Twitter 应用程序 [重复]

    这个问题在这里已经有答案了 可能的重复 Twitter 应用程序的 Android Intent https stackoverflow com questions 2077008 android intent for twitter ap
  • android 谷歌+登录定制

    我正在创建一个 Android 应用程序 现在我正在实现社交网络登录 Facebook 按钮很好 但 google 按钮的语言与 Facebook 不同 另外 它只说 登录 我想让它说 用谷歌登录 我是 android 编程的新手 看到我需
  • 无法合并 Dex - Android Studio 3.0

    当我在稳定频道中将 Android Studio 更新到 3 0 并运行该项目时 我开始收到以下错误 Error Execution failed for task app transformDexArchiveWithExternalLi
  • 更改 AChartEngine 中的图例大小

    我想专门更改饼图的图例大小输出 我已经尝试了所有可以找到的 AChartEngine 方法 但没有一个只能更改图例文本大小 我必须重写 onDraw 函数吗 如果是这样 怎么办 要设置图例高度 请使用 renderer setLegendH
  • 在 Android 中将应用程序上下文保存到静态变量是否安全?

    我知道在 Android 上使用静态变量是相当危险的 特别是当您将它们引用到活动时 但是 如果我有一个扩展 Application 的类 我们称此类为 App 引用此类的实例是否安全 如果是这样 任何其他类对应用程序上下文进行任何类型的引用
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Android 手机应用意图

    我想在手机上启动手机应用程序作为意图 我正在使用这个代码 startActivity getPackageManager getLaunchIntentForPackage com android phone 但该函数抛出一个空指针异常 因
  • 如何在 Android 清单文件中设置文本外观?

    是否可以做相当于 setTextAppearance context android R style TextAppearance Medium 在 Android 应用程序的清单文件中 android textAppearance and
  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 有没有办法在Android上创建一个三角形按钮?

    有没有办法创建一个三角形的按钮 我知道我可以将三角形图像作为背景 但这将使三角形之外的区域可单击 有没有办法固定按钮角 X 和 Y 以便我可以将其变成三角形 您可以覆盖OnTouch http developer android com r
  • Android:如何监控WiFi信号强度

    当信号强度发生变化时我会收到通知 我尝试创建以下方法并在 onCreate 中调用它 private void initializeWiFiListener Log i TAG executing initializeWiFiListene
  • 如何在android中录制音频时暂停背景音乐

    我正在 Android 中开发一个音频记录应用程序 因此 如果设备音乐播放器中已播放任何背景音乐 则应在开始录制之前暂停该背景音乐 并且每当录制停止或暂停时 背景音乐都应恢复 播放录制的音频时也应该如此 有人可以帮我解决这个问题吗 提前致谢
  • Android:单一活动,多个视图

    我不是 Android 专业人士 尽管我开发了一个包含 50 多个活动的应用程序 这使得该应用程序非常庞大 经过8周的开发 现在出现了一些问题 导致应用程序难以维护和升级 我正在处理的主要问题是 我无法将对象引用传递给活动的构造函数 事实上
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • Android应用程序kill事件捕获

    我想在我的应用程序被终止时执行一些操作 可以使用哪种方法来实现此目的 我正在开发 Android 5 0 这个问题的关键在于 您必须了解您的申请是否可以收到任何 当您的应用程序在任何情况下被终止时的额外回调 下面的答案是由德文连线 http
  • Amazon IAP 不会调用 onPurchaseResponse

    我有一个 Android 应用程序 它使用 IAP 我正在发送PurchasingManager initiateGetUserIdRequest 并得到用户识别成功 in onGetUserIdResponse 得到回复后Purchasi

随机推荐

  • Redis系列 - 单线程的Redis为什么那么快?

    Redis系列 单线程的Redis为什么那么快 Redis为什么使用单线程 在说这个问题之前我们先来了解下引入多线程常见的开销 1 上下文切换 即使是单核CPU也支持多线程执行代码 CPU通过给每个线程分配CPU时间片来实现这个机制 时间片
  • 三种开窗函数详细用法,图文详解

    开窗函数的详细用法 一 开窗函数的语法 二 从聚合开窗函数sum score over partition by name 讲起 三 开窗函数之first value last value lead lag 四 排名开窗函数ROW NUMB
  • 什么是百分比堆积条形图?

    条形图实际上范围很广 它是以横置图形展示数据的一种图表类型 百分比堆积条形图即以堆积条形图的形式来显示多个数据序列 但是每个堆积元素的累积比例始终总计为 100 它主要用于显示一段时间内的多项数据占比情况 百分比堆叠条形图将多个数据集的条形
  • Web网站的性能测试工具

    随着Web 2 0技术的迅速发展 许多公司都开发了一些基于Web的网站服务 通常在设计开发Web应用系统的时候很难模拟出大量用户同时访问系统的实际情况 因此 当Web网站遇到访问高峰时 容易发生服务器响应速度变慢甚至服务中断 为了避免这种情
  • 三子棋大致构建思路

    设计思路 1 菜单 输入选择 1 PLAY 开始游戏 0 EXIT 退出游戏 其他 重新进入菜单选择 2 PLAY 开始游戏 大致结构 1 创建并打印棋盘 2 玩家下棋 3 电脑下棋 4 判断局势 5 得出结果 6 返回1 菜单 3 创建并
  • Unity 入门打字机效果

    Unity 入门打字机效果 使用协程加延迟 public class UIDazhi MonoBehaviour public Text t private string currentstr public string str 欢迎来到U
  • Nginx HTTP 健康检查

    通过发送定期健康检查 包括 NGINX Plus 中可自定义的主动健康检查 来监控上游组中 HTTP 服务器的健康状况 介绍 NGINX 和 NGINX Plus 可以持续测试您的上游服务器 避免出现故障的服务器 并将恢复的服务器优雅地添加
  • e-009 matlab,matlab使用贝叶斯优化的深度学习

    此示例说明如何将贝叶斯优化应用于深度学习 以及如何为卷积神经网络找到最佳网络超参数和训练选项 要训练深度神经网络 必须指定神经网络架构以及训练算法的选项 选择和调整这些超参数可能很困难并且需要时间 贝叶斯优化是一种非常适合用于优化分类和回归
  • QT简单播放视频窗口

    一 要点 1 创建一个Widget主窗体 名为test的类 QLabel作为播放框 QListWidget作为播放列表 一个暂停按钮 暂时没懂修改 无法实现进度条进度 只是实现了双击列表 循环播放视频 或者点击按钮 暂停 继续播放视频 2
  • 1.1、Ubuntu 18.04安装(PC+虚拟机)

    一 虚拟机安装 二 PC机安装 2 1制作启动盘 2 2安装步骤 Ubuntu 18 04下载与安装 Linux有上百种不同的发行版 这里学习和使用的是Ubuntu的发行版 Ubuntu 18 04版 搭载PC端或虚拟机进行学习使用 官方下
  • C++二叉树

    代码随想录 programmercarl com 二叉树理论基础篇 算法公开课 代码随想录 算法视频公开课 opens new window 大纲如下 说到二叉树 大家对于二叉树其实都很熟悉了 本文呢我也不想教科书式的把二叉树的基础内容再啰
  • 韦东山视频第3课第2节_JNI_C调用JAVA_P【学习笔记】

    C调JAVA方法主要步骤如下 一 C代码调用java的静态方法 Hello java 1 public class Hello 2 public static void main String args 3 System out print
  • Android多媒体--MediaCodec api

    http www cnblogs com roger yu p 5635494 html MediaCodec public final class MediaCodec extends Object Java lang Object an
  • react-umi-对接Api-1.登录模块

    本篇看点 我们设计了一个很漂亮的登录UI ProForm组件的使用 跳转记录路由 提交前使用md5加密 使用umi框架做登录的话是要刷新跳转页面的 因为要配合app tsx的生命周期进行动态路由实现 官方那边也是这样做的 如果你不需要动态路
  • 学计算机的适不适合买苹果电脑,笔记本电脑的选择真的很重要!别再瞎买了

    原标题 笔记本电脑的选择真的很重要 别再瞎买了 笔记本的选择真的很重要 我求求大家不要想两三千就能买到真正好的笔记本 高端商务本真的有很多一万多块钱性能还不咋地 所以选对了适合你的才是最重要的 所以今天就来聊聊笔记本那些事 1 微软surf
  • Angular -ui - BootStrap组件的解释以及使用

    关于UI BootStrap UI BootStrap 是angularUI团队用纯粹angularJS语法编写的Bootstrap组件 1 关于ng router angular router js 和ui router angular
  • 五种方法 前端代码实现九宫格布局

    前端实现一个九宫格布局 可以用多少种方法实现呐 今天我们就来实际操作一下 看有多少种实现方式 首先 定义好通用的HTML结构 div class box ul li 1 li li 2 li li 3 li li 4 li li 5 li
  • C#入门一一类(class)

    一 什么是类 类的定义 class Person 默认修饰符是internal 表示仅在当前项目内可被访问 Class members 类访问修饰符 注意 1 在C 中只能有一个基类 如果继承了一个抽象类 则必须实现所继承的所有抽象成员 除
  • websocket 携带请求头_深入剖析WebSocket的原理

    前言 针对以上您提起的WebSocket的相关话题 给您做一下系统的梳理 WebSocket是和http类似的可以实现全双工可持久连接通信的应用层协议 以下深入剖析一下WebSocket的原理 什么是WebSocket 首先 我们需要弄明白
  • Kotlin依赖注入框架Koin

    一 简介 Koin是一款轻量级的依赖注入框架 它允许Android应用程序轻松管理组件之间的依赖关系 Koin的主要目标是使依赖注入变得简单 易于理解和使用 它采用纯Kotlin编写 无代理 无需代码生成或反射 而是基于函数式DSL和注解