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 的主要作用:

  1. 动态加载实现类ServiceLoader 允许您在运行时动态加载实现特定接口的类。这些实现类通常被认为是插件,它们扩展了应用程序的功能,而不需要对应用程序本身进行修改。

  2. 解耦应用程序组件:通过使用 ServiceLoader,应用程序的核心组件可以定义接口,而实际的功能或实现可以通过插件方式提供。这有助于减少组件之间的耦合,使应用程序更加模块化和可维护。

  3. 扩展应用程序功能ServiceLoader 允许开发者轻松地为应用程序添加新的功能或服务,而不必修改或重新编译现有代码。这在创建可扩展的应用程序和框架中非常有用。

  4. 服务提供者配置文件ServiceLoader 需要一个服务提供者配置文件,通常位于 META-INF/services/ 目录下,其中列出了实现特定接口的类的全限定类名。这个配置文件通常是通过 @AutoService 注解生成的。

  5. 多实现支持ServiceLoader 支持多个实现类,您可以同时加载多个实现特定接口的类,并以迭代的方式访问它们。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/151920.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机的温度测量报警系统的设计与制作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实习目的二、实习任务2.1 设计温度测量报警系统硬件电路2.2 温度测量报警系统软件编程、仿真与调试&#xff1b;2.3 完成温度测量报警系统的实物制作与调试…

LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验

实验条件&#xff1a; test2——20.0.0.20——主服务器——ipvsadm、keepalived服务 test3——20.0.0.30——备服务器——ipvsadm、keepalived服务 nginx5——20.0.0.51——后端真实服务器1&#xff08;tomcat的代理服务器&#xff09;——nginx服务 nginx6——20.0.0.61—…

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明&#xff1a; 激活函数以sigmoid为例。 神经元&#xff1a;有两层&#xff0c;线性层和激活层&#xff1a;yw*xb,然后y‘sigmoid(y)&#xff0c;也就是。 梯度…

C++ string 类的其他操作

4.3.2 string 类的其他操作 在C新增string类之前,程序员也需要完成诸如给字符串赋值等工作。对于C语言式的字符串,程 序员使用C语言库中的函数来完成这些任务。头文件cstring(以前为string.h)提供了这些函数。例如,可 以使用函数 strcpy()将字符串复制到字符数组中,使用函数…

【RTOS学习】软件定时器 | 中断处理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 软件定时器 | 中断处理 &#x1f3c0;软件定时器⚽守护任务守护任务的调度 ⚽使用软件定时器的函数…

在Go项目中二次封装Kafka客户端功能

1.摘要 在上一章节中,我利用Docker快速搭建了一个Kafka服务,并测试成功Kafka生产者和消费者功能,本章内容尝试在Go项目中对Kafka服务进行封装调用, 实现从Kafka自动接收消息并消费。 在本文中使用了Kafka的一个高性能开源库Sarama, Sarama是一个遵循MIT许可协议的Apache Kafk…

【MySQL】并发事务产生的问题及事务隔离级别

先来复习一下事务的四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是不可分割的最小操作单位&#xff0c;事务中的所有操作要么全部执行成功&#xff0c;要么全部失败回滚&#xff0c;不能只执行其中一部分操作。一致性&#xff08;Consisten…

排序算法-堆积树排序法(HeapSort)

目录 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 2、算法分析 3、C代码 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 堆积树排序法是选择排序法的改进版&#xff0c;可以减少在选择排序法中的比较次数&#xff0c;进而减少排序…

hdlbits系列verilog解答(模块按位置)-21

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 此问题类似于上一个&#xff08;模块&#xff09;。您将获得一个名为的 mod_a 模块&#xff0c;该模块按此顺序具有 2 个输出和 4 个输入。您必须按位置将 6 个端口按该顺序连接到顶级模块的端口 out1 、 out2…

pycharm 2023.2.3设置conda虚拟环境

分两步&#xff1a; &#xff08;1&#xff09;设置Virtualenv Environment &#xff08;2&#xff09;设值Conda Executable 加载conda环境&#xff0c;然后选择conda环境

仓库管理系统源代码集合,带图片展示和网站演示

目录 1、ModernWMS2、GreaterWMS3、kopSoftWMS4、SwebWMS5、若依wms6、jeewms 1、ModernWMS 体验地址&#xff1a;https://wmsonline.ikeyly.com 简易完整的仓库管理系统 该库存管理系统是&#xff0c;我们从多年ERP系统研发中总结出来的一套针对小型物流仓储供应链流程。 简…

JavaScript基础知识18——逻辑运算符之短路运算

哈喽&#xff0c;大家好&#xff0c;我是雷工。 本节学习JavaScript基础知识——逻辑运算符中的短路运算&#xff0c;以下为学习笔记。 规则&#xff1a; 1、如果是&&运算&#xff0c;只要遇到false&#xff0c;就立即短路&#xff0c;不会再执行了&#xff0c;直接返回…