SPI机制原理+使用

一、概述

SPI全称(Service Provider Interface),是JDK内置的一种服务提供发现机制;SPI机制提供了组件发现和注册方式,可以为应用程序提供灵活的插件机制, 主要原理:接口 + 反射+ 配置文件。

二、规范

定义接口,并为接口提供具体的实现类,实现模块之间的解耦;具体规则如下:

  • 在接口实现模块的resources目录下新建 META-INF/services/目录,并在META-INF/services目录下新建文件:
    • 文件名为SPI接口的权限定名。
    • 文件内容为该接口的具体实现类的权限定名。
  • 将SPI所在的jar放在主程序的classpath中。
  • 服务调用方使用 java.util.ServiceLoader去动态加载META-INF/services目录下具体的实现类到JVM中。

注意:也可以使用@AutoService(xxx.class)注解,无需手动创建目录文件,会在maven打包时自动创建相应的文件,maven依赖如下:

<dependency><groupId>com.google.auto.service</groupId><artifactId>auto-service-annotations</artifactId><version>1.0.1</version>
</dependency>

三、实践Demo

在这里插入图片描述
新建三个模块
在这里插入图片描述
(1)模块:java-spi-application 对应应用程序
在这里插入图片描述
pom.xml
在这里插入图片描述

(2)模块:java-spi-interface对应spi接口定义

  • 定义接口:
    在这里插入图片描述
  • 定义工厂,此处为加载SPI接口实现类的入口:
    在这里插入图片描述
    (3)模块:java-spi-provider
  • SPI接口实现类:
    在这里插入图片描述
  • 在接口实现模块的resources目录下新建 META-INF/services/目录,并在META-INF/services目录下新建文件
    在这里插入图片描述

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

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

相关文章

如何实现WinApp的UI自动化测试?

WinApp&#xff08;WindowsAPP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinApp&…

【SpringBoot】SwaggerKnif4j接口文档集成

[TOC] 序&#xff1a;接口文档 ​ 在开发过程中&#xff0c;接口文档是非常重要的一环&#xff0c;在 Spring Boot 中&#xff0c;我们可以通过集成第三方来实现接口文档的自动生成。 ​ 通过注解来描述接口&#xff0c;然后根据这些注解自动生成接口文档&#xff0c;它不仅…

4.Python数据序列

Python数据序列 一、作业回顾 1、面试题 有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何? 白话文:有一个数字,不知道具体是多少,用3去除剩2,用5去除剩3,用7去除剩2个,问这个数是多少?1 ~ 100以内的整数 while循环: # 初始化计数器 i = …

python编程从入门到实践(1)

文章目录 2.2.1命名的说明2.3字符串2.3.1使用方法修改字符串的大小写2.3.2 在字符串中使用变量2.3.3 制表符 和 换行符2.5.4删除空白2.5.5 删除前缀&#xff0b;后缀 2.2.1命名的说明 只能包含&#xff1a;字母&#xff0c;下划线&#xff0c;数字 必须&#xff1a;字母&#…

【Swagger】常用注解的使用、SpringBoot的整合及生产环境下屏蔽Swagger

一、引言 1、什么是Swagger&#xff1f; Swagger是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化RESTful风格的Web服务。它使得部署管理和使用功能强大的API从未如此简单。Swagger让文件的方法、参数和模型紧密集成到服务器端的代码&#xff0c;允许API始终保…

基于AT89C51单片机可做实物的温度烟雾火灾报警设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88658141?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤02 摘要 随着现代家庭用火、用电量的增加&#xff0c;家庭火灾发生的频率越来越高。火灾报警…

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性&#xff1f; 105.什么是缓存穿透&#xff0c;什么是缓存雪崩&#xff1f;怎么解决&#xff1f; 106.如何对数据库进行优化&#xff1f; 107.使用索引时有哪些原则&#xff1f; 108.存储过程如何进行优化&#xff1f; 109.说说…

HTML使用JavaScript的三种方式

要使用 JavaScript&#xff0c;你可以在 HTML 文件中的 <script> 标签中编写代码&#xff0c;或者将代码保存到一个单独的 .js 文件中并在 HTML 文件中引入。以下是一些常用的 JavaScript 使用方式&#xff1a; 内联 JavaScript&#xff1a;在 HTML 文件的 <script&g…

Hive实战:统计总分与平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、创建Hive表&#xff0c;加载HDFS数据文件…

劫持最新版 QQNT / QQ / TIM 客户端 ClientKeys

针对 TX官网 最新发布的 QQNT 9.9.6 与 QQ 9.7.21 新版本客户端全面更新截取代码 大伙应该都知道自从 QQ 9.7.20 版本起就已经不能通过模拟网页快捷登录来截取 Uin 跟 Clientkey 数据&#xff0c;而此次 TX官网 最新发布的 QQNT 9.9.6 与 QQ 9.7.21 可谓是采用了全新的技术、全…

Python列表的介绍与操作 增改查,连接,赋值,复制,清空

列表 在日常中我们通过给变量赋值来存储数据,比如 a "hello" b "world" c "你好啊" d "....."由于变量一次只能存储一个数据,但我们如果想一次存储多个数据,的话这样存储会很复杂,所以,我们可以通过列表 列表(List)是Python中的…

详解Vue3中的鼠标事件click和dblclick

本文主要介绍Vue3中的常见鼠标事件。 目录 一、click——单击事件二、dblclick——双击事件三、在使用click和dbclick需要注意的地方 下面是Vue 3中常用的鼠标事件&#xff1a; 一、click——单击事件 click事件是一种常见的事件类型&#xff0c;用于在用户点击某个元素时触发…