Android [SPI,AutoSerivce,ServiceLoader]
记录一下在Android中使用SPI的过程。
1.项目gralde文件。
plugins {id 'kotlin-kapt'
}
dependencies {implementation 'com.google.auto.service:auto-service:1.0-rc7' kapt "com.google.auto.service:auto-service:1.0-rc7"
} 这个AutoService项目的依赖文件需要在项目目录下添加
3. 完整gradle文件如下:
plugins {id 'com.android.application'id 'org.jetbrains.kotlin.android'//kapt作用我们要是用@AutoService注解,需要使用到这个。 id 'kotlin-kapt'
}android {namespace 'com.test.compose'compileSdk 33defaultConfig {applicationId "com.test.compose"minSdk 21targetSdk 33versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"vectorDrawables {useSupportLibrary true}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'}buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion '1.2.0'}packagingOptions {resources {excludes += '/META-INF/{AL2.0,LGPL2.1}'}}
}dependencies {implementation 'androidx.core:core-ktx:1.7.0'implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'//这个是compose依赖类, implementation 'androidx.activity:activity-compose:1.3.1'implementation "androidx.compose.ui:ui:$compose_ui_version"implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"implementation 'androidx.compose.material:material:1.2.0'androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version"debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version"debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version"//kapt作用我们要是用@AutoService注解,需要使用到这个。 implementation 'com.google.auto.service:auto-service:1.0-rc7'kapt "com.google.auto.service:auto-service:1.0-rc7"testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.5'androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'}
4. SPI代码:
kotlin 代码Service接口代码:
//服务接口类。
interface IComposableService<T> {}//
object ComposableServiceManager {private val composableMap = HashMap<String, IComposableService<*>>()init {ServiceLoader.load(IComposableService::class.java).forEach {composableMap[it.type] = it}}
}/****/
@AutoService(IComposableService::class)
class TextComposable : IComposableService<Model1> {}

5.AutoServicce注解
在 Kotlin 中,@AutoService 注解与 Google 的 AutoService 库一起使用,用于生成用于 Java Service Loader 的元数据文件。这在某些情况下可用于插件化系统,以便在运行时动态加载和发现实现特定接口的类。以下是 @AutoService 在 Kotlin 中的作用:
生成服务提供者配置文件:@AutoService 注解用于生成服务提供者接口的配置文件,该文件通常位于 META-INF/services/ 目录下。这个配置文件通常包含了实现某个接口的类的全限定类名。
Service Loader 支持:Java 提供了 ServiceLoader 类,允许在运行时动态加载实现服务接口的类。@AutoService 注解生成的配置文件是为了与 ServiceLoader 一起使用,使您能够以插件化的方式加载和发现服务实现类。
简化配置:通过使用 @AutoService,您可以避免手动编辑服务提供者配置文件。这有助于减少潜在的配置错误,提高代码的可维护性。
以下是 @AutoService 在 Kotlin 中的基本用法示例:
上面的@AutoServicce注解的作用就是用来生成IComposeableService接口文件的。这个文件记录内容如下:
com.test.compose.base.TitleComposable
6. ServiceLoader的作用。
ServiceLoader 是 Java 中的一个工具类,它的主要作用是在运行时动态加载实现特定接口的类。它通常与 Java Service Provider 接口(SPI)结合使用,允许开发者以插件化的方式扩展应用程序,而无需硬编码或重新编译应用程序。
以下是 ServiceLoader 的主要作用:
-
动态加载实现类:
ServiceLoader允许您在运行时动态加载实现特定接口的类。这些实现类通常被认为是插件,它们扩展了应用程序的功能,而不需要对应用程序本身进行修改。 -
解耦应用程序组件:通过使用
ServiceLoader,应用程序的核心组件可以定义接口,而实际的功能或实现可以通过插件方式提供。这有助于减少组件之间的耦合,使应用程序更加模块化和可维护。 -
扩展应用程序功能:
ServiceLoader允许开发者轻松地为应用程序添加新的功能或服务,而不必修改或重新编译现有代码。这在创建可扩展的应用程序和框架中非常有用。 -
服务提供者配置文件:
ServiceLoader需要一个服务提供者配置文件,通常位于META-INF/services/目录下,其中列出了实现特定接口的类的全限定类名。这个配置文件通常是通过@AutoService注解生成的。 -
多实现支持:
ServiceLoader支持多个实现类,您可以同时加载多个实现特定接口的类,并以迭代的方式访问它们。
相关文章:
Android [SPI,AutoSerivce,ServiceLoader]
记录一下在Android中使用SPI的过程。 1.项目gralde文件。 plugins {id kotlin-kapt } dependencies {implementation com.google.auto.service:auto-service:1.0-rc7 kapt "com.google.auto.service:auto-service:1.0-rc7" } 这个AutoServ…...
【Linux】ASCII码表-256个
ASCII码简介: ASCII码 是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646 。在这个页面,你可以找到8位的256个字符、ASCII码表和Windows-1252 (code page 1252,它是国际标准ISO 8859-1的一个扩展字符集) 标准保持一致;ASCII码 是 A…...
node.js - 上传文件至阿里云oss
deploy.js const fs require(fs) const path require(path) const util require(util) const OSS require(ali-oss)/*因为,在Node.js中,许多核心模块的函数都是采用回调函数的形式进行异步操作的,即在操作完成后调用回调函数来处理结果。…...
xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中
如果你看官方文档,在研究透,至少也得几天时间,如果你直接看我的文档,快速用到项目中,也就10分钟就搞好了。 xxl-job功能确实很强大,而且使用的人比较多,既然在使用xxl-job,那肯定是…...
Qt生成PDF报告
文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…...
Jenkins 安装全攻略:从入门到精通
目录 一:安装文件夹准备 1.打开,/home/admin目录 2.新建三个文件夹 二:安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三:安装Maven 1.打开maven目录进行…...
迎重阳,话养老:平安养老险如何助力国民“养老梦”?
10月23日,我们将迎来传统节日重阳节,又称敬老节,自古就有祭祖、登高、赏菊三大风俗,流传至今,已成为人们孝老敬老的重要节日。 随着老龄化日益加深,在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...
微信小程序获取用户信息
个人博客 微信小程序获取用户信息 个人微信公众号,求关注,求收藏,求指错。 文章概叙 本文主要讲的是小程序获取用户信息的,更新测试时间是2023-10-25 更改原因 首先,官网上的解释是这样的,为了安全合…...
Mysql 索引原理和优化方式
一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 (1) Hash 索引 Hash 索引是比较常见的一种索引,他的单条记录查询的效率很高,时间复杂度为1。但是,…...
Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题
1:首先使用VMware Workstation安装一个Ubuntu的系统。 2:现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3:进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4:提示下面错误,Package open-vm…...
【Docker】Docker Swarm介绍与环境搭建
为什么不建议在生产环境中使用Docker Compose 多机器如何管理?如何跨机器做scale横向扩展?容器失败退出时如何新建容器确保服务正常运行?如何确保零宕机时间?如何管理密码,Key等敏感数据? Docker Swarm介…...
国产CAN总线收发芯片DP1042 兼容替换TJA1042
说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,支持 5Mbps CAN FD 灵活数据速率,具有在总线与 CAN 协议控制器之间进行差分信号传输的能力,完全兼容“ISO…...
[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构
目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图,是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...
【接口技术】定时计数器习题
1:8253芯片有______个端口地址。 【可选】 2 3 4 6 解答:4 2:8253芯片有______种工作方式。 【可选】 3 4 5 6 解答:6 3: 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...
DC电源模块的的散热结构合理布局
BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而,随着功率密度不断提高,DC电源模块产生的热量也越来越大,散热问题变得越来越突出。为了保障电路的稳定性和可靠性,必须采取合…...
Fedora Linux 38下安装音频与视频的解码器和播放器
Fedora Linux 38 操作系统安装好后,默认是没有音频与视频的解码器的,音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件,需要我们自己手动安装。、 连接互联网,打开Shell命令行: 1. sudo d…...
边缘计算:云计算的延伸
云计算已经存在多年,并已被证明对大大小小的企业都有好处;然而,直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理,更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...
【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源
引言 openGauss是一款开源的关系型数据库管理系统,它提供了强大的功能和性能,可以满足各种企业级应用的需求。与此同时,ODBC(Open Database Connectivity)是一个标准的数据库访问接口,它允许应用程序通过统…...
WSL——ubuntu中anaconda换源(conda、pip)
1、conda 打开Ubuntu,输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏,输入:\\wsl$。打开Ubuntu根路径,其中显示了.condarc文件。 以文本形式打开,并输入要换的源,保存即可。…...
IP地址在网络安全中的关键作用
IP地址(Internet Protocol Address)是互联网世界中的重要标识符,它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此,还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...
从草图到文档:我用这5个Miro/PlantUML模板,高效搞定团队架构设计评审
从草图到文档:5个高效架构设计模板与团队协作实战指南 在敏捷开发环境中,架构设计往往陷入两难困境——既要快速响应需求变化,又要保证设计文档的准确性与可维护性。Tech Lead们经常面临这样的场景:在白板前与团队激情讨论出的架构…...
告别命令行恐惧:用乐鑫官方Flash Download Tool图形化烧录ESP32-S3固件(保姆级图文教程)
告别命令行恐惧:乐鑫Flash Download Tool图形化烧录ESP32-S3全指南 第一次接触ESP32开发板时,那个闪烁的命令行窗口让我手足无措。直到发现乐鑫官方的Flash Download Tool,才发现原来固件烧录可以如此直观简单——不需要记忆任何命令参数&…...
OpenClaw多模型对比:Qwen3.5-4B-Claude与基础版任务实测
OpenClaw多模型对比:Qwen3.5-4B-Claude与基础版任务实测 1. 测试背景与模型选择 最近在搭建个人自动化工作流时,我发现OpenClaw的任务执行质量高度依赖底层大模型的推理能力。为了找到最适合复杂任务的模型,我决定对两个版本进行系统测试&a…...
3分钟搞定专业录屏:QuickRecorder让你的macOS录制效率翻倍
3分钟搞定专业录屏:QuickRecorder让你的macOS录制效率翻倍 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHub…...
轮速计里程计:从后轮速差模型到精准定位的实现与挑战
1. 轮速计里程计:为什么后轮速差模型是机器人的“起点”? 如果你刚开始接触机器人定位,面对IMU、激光雷达、视觉这些五花八门的传感器,可能会有点懵。别急,绝大多数轮式机器人的定位之旅,都是从脚下开始的&…...
本地部署音效生成器 Moodist 并实现外部访问
Moodist 是基于 MIT 许可的开源白噪音平台,提供了超过 75 种不同的环境声音,可以帮助用户集中注意力、保持冷静或进入放松状态。它还支持持久化声音选择,用户能够自定义声音预设,分享他们的音频配置给他人,并且集成睡眠…...
从汽车以太网到智能座舱:TSN的CBS和抢占式TAS如何保障你的行车安全与娱乐体验
从汽车以太网到智能座舱:TSN的CBS和抢占式TAS如何保障行车安全与娱乐体验 当你在高速公路上开启自动驾驶功能,车辆需要同时处理毫米波雷达的实时数据、中控屏的4K视频流以及车窗升降的指令——这些需求对网络传输的要求截然不同。传统车载网络架构正面临…...
STM32 SRAM与FLASH调试配置实践
在SRAM与FLASH中调试STM32代码的工程实践1. 调试环境选择背景STM32微控制器的内部FLASH擦写次数约为1万次,频繁的调试过程会加速FLASH寿命的消耗。同时,SRAM存储器的写入速度显著快于内部FLASH,这使得在SRAM中进行程序调试具有以下优势&#…...
GLM-4-9B-Chat-1M实战:vLLM部署教程+Chainlit前端搭建,一步到位
GLM-4-9B-Chat-1M实战:vLLM部署教程Chainlit前端搭建,一步到位 1. 项目概述 GLM-4-9B-Chat-1M是智谱AI推出的新一代预训练模型,支持高达1M(约200万中文字符)的上下文长度。本教程将带您完成从模型部署到前端搭建的完…...
RVC语音训练实战:从零开始3分钟极速训练模型,打造你的专属AI歌手
RVC语音训练实战:从零开始3分钟极速训练模型,打造你的专属AI歌手 1. RVC简介与准备工作 RVC(Retrieval-based-Voice-Conversion)是一款强大的AI语音转换工具,能够让你快速训练出专属的AI歌手模型。与传统语音合成技术…...
