KSP实战-使用ksp AutoService为SPI自动生成配置文件

AutoService

AutoService KSP annotation processor

简介

AutoService是自动为Service Provider Interface(SPI)生成 META-INF/services 配置的高性能KSP注解处理器插件;

效果如图:

image-20231215171801088

背过Java面试题的应该都知道SPI,对于Android开发者来说,可以使用SPI实现基于接口的模块解耦;具体可以参考这位大佬的文章 Android 中 SPI 的使用 , 这里不在赘述;

接入

1、 添加jitpack仓库,最新版本 1.0.2; 可去 jitpack/AutoService 查询;

maven { url 'https://jitpack.io' }

2、 为项目接入ksp插件,详见 build.gradle ,如已配置则忽略

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {id 'com.google.devtools.ksp' version '1.7.20-1.0.8' apply false
}

注意:本项目使用kotlin1.7.20 & ksp 1.7.20-1.0.8, 低于kotlin1.7.20的可能会出现错误,高于kotlin1.7.20应该是会兼容的;

3、 导入AutoService注解对应依赖

implementation("com.github.JailedBird.AutoService:api:VERSION")

4、 需要使用插件的各个模块,使用ksp导入插件

ksp("com.github.JailedBird.AutoService:compiler:VERSION")

使用

详见 AutoService/app

1、 添加SPI机制需要的接口

interface TestInterface1<T> {fun hello()
}interface TestInterface2<T> {
}

注意:仅支持接口,非接口会在编译时报错

2、 添加SPI机制的实现类

@AutoService
open class TestImpl1 : TestInterface1<String> {override fun hello() {Log.d("TAG", "TestImpl1@${this.hashCode()} hello ")}
}@AutoService(target = TestInterface2::class)
class TestImpl2<T> : TestInterface2<String> {
}

其中,如果实现类是单继承接口则可忽略target,否则必须显示指定;

注意:出于KSP注解处理性能(涉及增量编译)的考量,这里只支持 单接口对单实现的映射关系,多对一会对注解处理性能影响较大,得不偿失;

3、 通过ServiceLoader加载实现类;

findViewById<Button>(R.id.test1).setOnClickListener {val service = ServiceLoader.load(TestInterface1::class.java).firstOrNull()if (service != null) {Toast.makeText(this, "已加载", Toast.LENGTH_SHORT).show()}service?.hello()}

注意: 每次加载都会生成新的对象!

cn.jailedbird.spi          D  TestImpl1@138565316 hello 
cn.jailedbird.spi          D  TestImpl1@208673584 hello 
cn.jailedbird.spi          D  TestImpl1@175356508 hello 

其他

如果本插件对您的学习或工作有帮助,请点亮star支持作者😘

PS:安利本人的Arouter Ksp注解处理器项目 ArouterKspCompiler ,非常深入地使用 ksp 框架;

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

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

相关文章

牛客小白月赛83

A-小天的金银铜铁_牛客小白月赛83 (nowcoder.com) AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; int a,b,c,d,e; int A,B,C,D; void solve() {cin>>a>>b>>c>>d>>e;cin>>A>>…

【c语言】【visual studio】动态内存管理,malloc,calloc,realloc详解。

引言&#xff1a;随着大一期末的到来&#xff0c;想必许多学生都学到内存的动态管理这一部分了&#xff0c;看望这篇博客后&#xff0c;希望能解除你心中对这一章节的疑惑。 (・∀・(・∀・(・∀・*) 1.malloc详解 malloc的头文件是#include <sdtlib.h>,malloc - C Ref…

【C语言】——认识指针变量和地址,以及指针变量类型的意义

&#x1f3a5; 岁月失语唯石能言的个人主页 &#x1f525;个人栏专&#xff1a;秒懂C语言 ⭐若在许我少年时&#xff0c;一两黄金一两风 目录 前言 一、指针变量和地址 1.1 取地址操作符&#xff08;&&#xff09; 1.2 指针变量和解引用操作符&#xff…

Linux上使用HTTP协议进行数据获取的实战示例

嗨&#xff0c;Linux爱好者们&#xff0c;今天我们要一起探讨一下如何在Linux上进行HTTP协议的数据获取。这不是一项简单的任务&#xff0c;但放心&#xff0c;我会以最简单的语言&#xff0c;结合实例来给大家讲解。 首先&#xff0c;我们需要一个工具&#xff0c;那就是curl…

Java 锁的优化

Java锁的优化主要包括以下几个方面&#xff1a; 锁优化&#xff1a; 锁优化主要是通过减少锁的粒度和缩小锁的范围来提高性能。锁优化的方法有&#xff1a; 减少锁的粒度&#xff1a;将大对象拆分成小对象&#xff0c;这样可以减少锁的竞争&#xff0c;提高并发性能。缩小锁…

Git 生成系统公私钥

windows下如何生成公钥和私钥 首先Windows操作系统需要安装git.安装完成后,再到任意的文件夹内,点击右键.选择git bash here打开之后,输入ssh-keygen,一路按enter键.全部结束后,再到C:\Users\Administrator\.ssh 文件夹下,打开id_rsa.pub文件,复制文件内的公钥. 注意:.ssh是隐…

“Java已死、前端已凉”?尊嘟假嘟?

一、为什么会出现“Java已死、前端已凉”的言论 “Java已死、前端已凉”的言论出现&#xff0c;主要是由于以下几个原因&#xff1a; 技术更新迅速&#xff1a;随着互联网技术的发展&#xff0c;新的编程语言和技术不断涌现。Java和前端技术作为广泛应用的技术&#xff0c;面临…

SpringBoot 源码解析

前言 本文只是纯源码分析文章&#xff0c;阅读者需要有Spring或者SpringBoot使用经验。 SpringBoot 源码解析 SpringBoot 源码解析1&#xff1a;环境搭建 SpringBoot 源码解析2&#xff1a;启动流程1 SpringBoot 源码解析3&#xff1a;启动流程2 SpringBoot 源码解析4&#…

初识Dubbo学习,一文掌握Dubbo基础知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

springMVC-@RequestMapping

基本介绍 RequestMapping注解可以指定控制器/处理器的某个方法的请求的url, 示例 &#xff08;结合springMVC基本原理理解&#xff09; Controller public class UserHandler {RequestMapping(value "/login")public String login() {System.out.println("登…

说说你对闭包的理解?闭包使⽤场景

作用链域闭包 闭包的特性&#xff1a;说说你对闭包的理解使用闭包的注意点总结 扩展 循环中使用闭包解决 var 定义函数的问题 解决办法有三种 作用链域 JavaScript 的作用域链&#xff08;Scope Chain&#xff09;是指在代码中访问变量时的查找路径。 当 JavaScript 引擎在执…

ubuntu20.04禁用自动更新(禁用更新、禁用自动升级、禁用apt更新、禁用apt升级、禁用软件更新、禁用系统更新)

想要禁用Ubuntu 20.04的所有自动升级&#xff0c;只需要修改两个文件&#xff1a; /etc/apt/apt.conf.d/10periodic&#xff1a; 这个文件控制APT的周期性任务。你需要编辑这个文件并设置所有选项为"0"&#xff0c;这将禁止任何定期的任务。 你可以使用以下命令快速完…

springCloud项目打包如何把jar放到指定目录下

springCloud项目打包如何把jar发放到指定目录下 maven-antrun-plugin springCloud微服务打包jar&#xff0c;模块过多&#xff1b;我的项目模块结构如下&#xff1a; 我把实体类相关的单独抽离一个模块在service-api下服务单独写在service某块下&#xff0c; 每个模块的jar都…

如何使用jQuery获取当前网址路径

如何使用jQuery获取当前网址路径概述在前端开发中&#xff0c;经常需要获取当前网址的路径&#xff0c;通过使用jQuery库&#xff0c;我们可以轻松地实现这个功能。本文将逐步介绍如何使用jQuery获取当前网址路径。流程步骤以下是实现该功能的步骤&#xff1a;步骤 描述…

人工智能导论复习资料

题型 1、简答题&#xff08;5题&#xff09; 2、设计题 3、综合题 4、论述题&#xff08;10分&#xff09; 考点 第一章 1、人工智能的定义、发展&#xff1b; 2、人工智能的学派、认知观及其间的关系&#xff1b; 3、人工智能要素及系统分类&#xff1b; 4、人工智能的研究、…

Python轴承故障诊断 (七)基于EMD-CNN-LSTM的故障分类

目录 前言 1 经验模态分解EMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 2.3 故障数据的EMD分解可视化 2.4 故障数据的EMD分解预处理 3 基于EMD-CNN-LSTM的轴承故障诊断分类 3.1 训练数据、测试数据分组&#xff0c;数据分batch 3.…

Fanuc-Focas库函数库中控制机床轴的移动

在Fanuc-Focas库中控制机床轴的移动&#xff0c;通常需要通过调用库函数来实现。具体的函数和参数可能因不同的库版本和机床型号而有所不同&#xff0c;因此请参考相关的Fanuc-Focas文档或手册以获取准确的信息。 一般来说&#xff0c;控制机床轴的移动需要以下几个步骤&#…

canal环境部署

docker 部署canal同步数据 1 环境: 2 Mysql 配置 查看 binlog 是否启用 SHOW VARIABLES LIKE ‘%log_bin%’; 开启 binlog, 修改 my.cnf docker cp mysql:/etc/my.cnf /data/mysql/conf 拷贝文件到临时目录修改后再拷贝回去 # For advice on how to change settings please …

ArchLinux安装使用ifconfig

安装 sudo pacman -S net-tools 使用 ifconfig

【网络安全】网络防护之旅 - 点燃网络安全战场的数字签名烟火

​ &#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《网络安全之道 | 数字征程》⏰墨香寄清辞&#xff1a;千里传信如电光&#xff0c;密码奥妙似仙方。 挑战黑暗剑拔弩张&#xff0c;网络战场誓守长。 ​ 目录 &#x1f608;1. 初识…