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.mzph.cn/news/588564.shtml

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

相关文章

Rust学习笔记002: 猜字游戏

version0.1 // 导入标准库中的 io 模块&#xff0c;它包含了输入输出相关的功能 use std::io;// 程序的入口点 fn main() {println!("Guess the number!");println!("Please input your guess.");// 创建一个可变的字符串变量 guess&#xff0c;用于存储用…

【Spring Security】快速入门之案例实操

目录 一、简介 1、什么是安全框架 2、主流的安全框架 3、为什么使用Spring Security 二、引言 1、什么是Spring Security 2、Spring Security工作原理 3、特点 三、快速入门 1、引入依赖 2、配置 3、启动测试 4、配置自定义账号密码 四、Web安全配置类 1.HttpSe…

一步一步写线程之三多线程设计开发

一、多线程开发 多线程开发在实际应用中是非常多的。正如前面分析所说&#xff0c;只要写一个线程&#xff0c;就可以认为是多线程开发。多线程开发没有最优&#xff0c;只有在指定场景下的最合适。没有任何一个模型可以包打所有的场景&#xff0c;所以在网上经常可以看到一些…

智安网络|实现安全与网络功能一体化:SASE的全新安全策略

随着企业信息化和数字化程度的不断提升&#xff0c;网络安全面临着前所未有的挑战。传统的网络安全模式已经无法满足日益复杂的安全需求。在这一背景下&#xff0c;安全访问服务边缘&#xff08;SASE&#xff09;崭露头角&#xff0c;并逐渐成为新一代网络安全架构的关键概念。…

云上安全责任共担模型

对于传统自建物理服务器模式&#xff0c;用户需要承担所有的安全责任&#xff0c;负责从物理基础设施到上层应用的所有层面的安全体系构建。 云服务器的安全责任确实与物理服务器不同&#xff0c;云上的安全性是一种责任共担模式&#xff0c;其中云服务器ECS的安全责任需要你&…

Hive中支持毫秒级别的时间精度

实际上&#xff0c;Hive 在较新的版本中已经支持毫秒级别的时间精度。你可以通过设置 hive.exec.default.serialization.format 和 mapred.output.value.format 属性为 1&#xff0c;启用 Hive 的时间精度为毫秒级。可以使用以下命令进行设置&#xff1a; set hive.exec.defau…

分布式技术之故障恢复技术

文章目录 分布式故障基础知识故障类型故障检测故障恢复 分布式故障检测原理故障恢复策略 分布式故障基础知识 故障类型 在任何一个分布式系统中&#xff0c;故障都是不可避免的。这里的故障&#xff0c;通常包括两类&#xff1a; 一类是物理故障&#xff0c;比如硬盘损坏、断电…

异常检测 | Matlab基于GNN图神经网络的数据异常数据检测

异常检测 | Matlab基于GNN图神经网络的数据异常数据检测 目录 异常检测 | Matlab基于GNN图神经网络的数据异常数据检测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 Matlab基于GNN图神经网络的数据异常数据检测。其核心思想是学习一个函数映射。本次使用人类活…

浅谈数字孪生的应用与发展

1、数字孪生概念 ”数字孪生是充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多物理量、多尺度、多概率的仿真过程,在虚拟空间中完成映射,从而反映相对应的实体装备的全生命周期过程。数字孪生是一种超越现实的概念,可以被视为一个或多个重要的、彼此依赖的装…

elasticsearch系列五:集群的备份与恢复

概述 前几篇咱们讲了es的语法、存储的优化、常规运维等等&#xff0c;今天咱们看下如何备份数据和恢复数据。 在传统的关系型数据库中我们有多种备份方式&#xff0c;常见有热备、冷备、全量定时增量备份、通过开发程序备份等等&#xff0c;其实在es中是一样的。 官方建议采用s…

easyrecovery软件2024免费版电脑文件数据恢复工具

easyrecovery怎么恢复文件?大家可以参考下文easyrecovery恢复文件步骤来操作&#xff0c;easyrecovery是一款很强大的数据恢复软件&#xff0c;那么我们该如何使用这款软件呢?一起来了解吧&#xff01; 一&#xff1a;EasyRecovery Professional 是一款非常不错的数据恢复软件…

在Django5中使用Websocket进行通信

Docker安装Redis docker run --restartalways -p 6379:6379 --name redis -d redis:7.0.12 --requirepass zhangdapeng520安装依赖 参考文档&#xff1a;https://channels.readthedocs.io/en/latest/installation.html pip install "channels[daphne]"展示聊天页…

js 常用方法举例说明50个

js 常用方法举例说明50个 JavaScript是一门广泛应用于Web开发的编程语言&#xff0c;它提供了丰富的方法来操作数据、处理事件、操作DOM等。以下是50个常用的JavaScript方法&#xff0c;每个方法都附有简单的说明和示例&#xff1a; getElementById&#xff1a; 通过元素的ID获…

【链表OJ—链表的回文结构】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

前端基础:Vue搞笑白话文(工作之余瞎写)

1、data:{}与data(){return{}}这两个是个什么鬼&#xff1f; vue实例 new Vue({el:#app,data:{name:李四}}) 组件实例 const aaa Vue.extent({data(){return {name:}} }) 为什么Vue实例可以那么写而组件实例就不行了&#xff1f;原因就是因为在底层原理上&#xff0c;组件…

华为电脑的IP地址:如何找到并管理?

​在现代科技的高速发展中&#xff0c;华为电脑已经成为了人们生活和工作中必不可少的重要工具。然而&#xff0c;对于很多用户来说&#xff0c;IP地址却是一个颇具挑战性的问题。在本文中&#xff0c;我们将会详细探讨华为电脑的IP地址在哪里找&#xff0c;并提供一些建议和技…

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …

python使用openpyxl为excel模版填充数据,生成多个Sheet页面

目标&#xff1a;希望根据一个给定的excel模版&#xff0c;生成多个Sheet页面&#xff0c;比如模版&#xff1a; 示例程序 import openpyxlexcel_workbook openpyxl.load_workbook("模版.xlsx") for _i in range(3): # 比如填充3个页面# 复制模版sheet页&#x…

Python单元测试模块Unittest测试代码简单示例

一、测试项目目录结构&#xff1a; 创建一个项目&#xff0c;目录中有Calculator.py与Demo_test_three.py两个源码文件。Calculator.py是被测试的代码&#xff0c;Demo_test_three.py是执行测试的代码。本示例建了两级目录。一级目录名称&#xff1a;my_unittest;二级目录名称…

基于NXP I.MX8 + Codesys的工业软PLC解决方案

全新i.MX 8M Plus是一个混合人工智能SoC&#xff0c;将先进的嵌入式SoC与最新的人工智能/机器学习硬件NPU技术相结合&#xff0c;通过神经网络加速器&#xff0c;为边缘计算提供强大的机器学习能力&#xff0c;是i.MX 8M Plus一个最为突出的优势。WEC-IMX8P核心板特别适合在机器…