当前位置: 首页 > news >正文

Java SPI机制了解与应用

1. 了解SPI机制

我们在平时学习和工作中总是会听到Java SPI机制,特别是使用第三方框架的时候,那么什么是SP机制呢?SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI 的作用就是为这些被扩展的 API 寻找服务实现。

2. 使用SPI机制

  1. 新建一个maven工程spiTest,包含两个子工程spiProvider、spiConsumer,工程结构如下:

在这里插入图片描述

  1. 在spiProvider工程中定义一个PowerJackInterface接口:

    package com.jing.standard;/*** 电源插座接口*/
    public interface PowerJackInterface {/*** 电源插座*/void doPowerJack();}
    
  2. 在spiProvider工程中提供一个实现类:

    package com.jing.standard.impl;import com.jing.standard.PowerJackInterface;public class PowerJack110V implements PowerJackInterface {@Overridepublic void doPowerJack() {System.out.println("这是110V电源插座!");}
    }
    
  3. 在spiProvider工程中resource目录下创建 META-INF/services/目录,并且创建一个名为com.jing.standard.PowerJackInterface的文件,内容如下:

    com.jing.standard.impl.PowerJack110V
    
  4. 在spiConsumer工程中引入spiProvider工程:

    <dependency><groupId>com.jing</groupId><artifactId>spiProvider</artifactId><version>1.0.0-SNAPSHOT</version>
    </dependency>
    
  5. 在spiConsumer工程中进行方法调用:

    package com.jing;import com.jing.standard.PowerJackInterface;import java.util.ServiceLoader;public class Main {public static void main(String[] args) {ServiceLoader loader = ServiceLoader.load(PowerJackInterface.class);loader.forEach(item -> {PowerJackInterface powerJackInterface = (PowerJackInterface) item;powerJackInterface.doPowerJack();});}
    }
    
  6. 运行结果:

    这是110V电源插座!
    
  7. 在spiConsumer工程中也增加一个PowerJackInterface接口实现类:

    package com.jing.service;import com.jing.standard.PowerJackInterface;public class PowerJack220V implements PowerJackInterface {@Overridepublic void doPowerJack() {System.out.println("220V电源插座!");}
    }
    
  8. 在spiConsumer工程中resource目录下创建 META-INF/services/目录,并且创建一个名为com.jing.standard.PowerJackInterface的文件,内容如下:

    com.jing.service.PowerJack220V
    
  9. 运行结果

    220V电源插座!
    这是110V电源插座!
    

3. SPI机制总结

JDK中的SPI实现,是由ServiceLoader类根据自定义传入类加载器或者应用程序类加载器在约定好的固定路径下(ClassPath:META-INF/services/)去查找和加载第三方接口实现类。
在这里插入图片描述

要使用JDK中的SPI机制有几个前提条件:

  • 服务提供方必须实现目标接口
  • 服务提供方必须在自身ClassPath:META-INF/services/路径下建立文件,文件名为目标接口全限定名;文件内容为实现目标接口的具体实现类全限定名。

相关文章:

Java SPI机制了解与应用

1. 了解SPI机制 我们在平时学习和工作中总是会听到Java SPI机制&#xff0c;特别是使用第三方框架的时候&#xff0c;那么什么是SP机制呢&#xff1f;SPI 全称 Service Provider Interface&#xff0c;是 Java 提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来…...

vue实现输入框中输完后光标自动跳到下一个输入框中

前言 最近接到这么一个需求&#xff0c;做一个安全码的输入框&#xff0c;限制为6位数&#xff0c;但是每一个写入的值都是一个输入框&#xff0c;共计6个输入框&#xff0c;当前输入框写入值后&#xff0c;光标自动跳到下一个输入框中&#xff0c;删除当前输入框写入的值后再自…...

如何构建 C 语言编译环境?

C语言是一种通用的编程语言&#xff0c;它是由Dennis Ritchie于20世纪70年代初在贝尔实验室开发的。C语言的设计目标是提供一种结构化、高效、可移植的编程语言&#xff0c;以支持系统编程和应用程序开发。C语言广泛用于开发操作系统、网络设备、游戏、嵌入式系统、桌面应用程序…...

电子台账:模板制作之一——列过滤(水平过滤)

1 简介列过滤即水平过滤。一般情况下&#xff0c;企业数据源文件中有很多数据列&#xff0c;其中大部分数据列中的数据对电子台账来说是没有用的。列过滤就是确定企业数据文件的哪几列有用&#xff0c;以及有用的列分别对应到台账&#xff08;模板&#xff09;的哪一列。列过滤…...

【java】Java连接mysql数据库及mysql驱动jar包下载和使用

文章目录JDBCJDBC本质&#xff1a;JDBC作用&#xff1a;跟数据库建立连接发送 SQL 语句返回处理结果操作流程和具体的连接步骤如下&#xff1a;操作步骤&#xff1a;需要导入驱动jar包 mysql-connector-java-8.0.22.jar注册驱动获取数据库连接对象 Connection定义sql获取执行sq…...

Mysql八股文

Mysql八股文 数据库的三范式是什么 第一范式&#xff1a;列不可再分第二范式&#xff1a;行可以唯一区分&#xff0c;主键约束第三范式&#xff1a;表的非主属性不能依赖与 其他表的非主属性 外键约束且三大范式是一级一级依赖的&#xff0c;第二范式建立在第一范式上&#x…...

解析Android ANR问题

一、ANR介绍 ANR 由消息处理机制保证,Android 在系统层实现了一套精密的机制来发现 ANR,核心原理是消息调度和超时处理。ANR 机制主体实现在系统层,所有与 ANR 相关的消息,都会经过系统进程system_server调度,具体是ActivityManagerService服务,然后派发到应用进程完成对…...

ESP32设备驱动-MicroSD Card驱动

MicroSD Card驱动 1、SDCard介绍 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器…...

XC7K160T-1FBG484I、XC7A100T-2CSG324I FPGA可编程门阵列 PDF规格书

1、XC7K160T-1FBG484I说明&#xff1a;Kintex-7 FPGA有-3、-2、-1、-1L和-2L速度等级&#xff0c;其中-3具有最高的性能。-2L器件被筛选为较低的最大静态功率&#xff0c;并且可以在较低的核心电压下运行&#xff0c;以获得比-2器件更低的动态功率。-2L工业(I)温度器件仅在VCCI…...

基于HD-RK3568-IO评估板的读写速度测试报告

1. 测试对象HD-RK3568-IOT 底板基于HD-RK3568-CORE工业级核心板设计&#xff08;双网口、双CAN、5路串口&#xff09;&#xff0c;接口丰富&#xff0c;适用于工业现场应用需求&#xff0c;亦方便用户评估核心板及CPU的性能。适用于工业自动化控制、人机界面、中小型医疗分析器…...

jconsole远程linux下的tomcat

修改Tomcat的配置 进去 Tomcat 安装目录下的 bin 目录&#xff0c;编辑 catalina.sh vi catalina.sh定位到 ----- Execute The Requested Command ----------------------------------------- vi 编辑模式下&#xff0c;点击 Esc&#xff0c;输入 / &#xff0c;然后粘贴 -…...

Redis和MySQL如何保持数据一致性?

在高并发的场景下&#xff0c;大量的请求直接访问MySQL很容易造成性能问题。所以&#xff0c;我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求。但是&#xff0c;MySQL和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键了。1.…...

频谱分析仪的工作原理

频谱分析仪是一种专门用于测量电信号频谱特征的精密仪器。它采用了一种将信号转换成频谱的方法&#xff0c;使得用户可以直观地了解信号的频谱密度&#xff0c;并通过分析频率分布来进行信号分析。频谱分析仪的工作原理基于傅里叶变换。傅里叶变换是一种将时间域信号转换为频率…...

docker项目自动化部署脚本(认真排版、工作积累)

要解决什么问题&#xff1f; 把日益复杂化、工程化的开发环境&#xff0c;以及生产环境&#xff0c;变得简单&#xff0c;自动化部署。 达到什么效果&#xff1f; 环境处处一致&#xff0c;并且自动化部署&#xff0c;提升生产力&#xff0c;又快又好。 当您更换电脑、更换…...

【经验分享】使用了6年的实时操作系统,是时候梳理一下它的知识点了 | 文末赠书4本

使用了6年的实时操作系统&#xff0c;是时候梳理一下它的知识点了 摘要&#xff1a; 本文简单介绍了博主学习操作系统的心路历程&#xff0c;同时还给大家总结了一下当下流行的几种实时操作系统&#xff0c;以及在工程中OSAL应该如何设计。希望对大家有所启发和帮助。 文章目录…...

蓝桥杯C/C++程序设计 往届真题汇总(进阶篇)

文章目录1. 最短路2. 数字三角形3. 递增序列4. 杨辉三角形5. 跳跃6. 路径7. 迷宫8. 装饰珠9. 明码10. 字串分值11. 作物杂交12. 承压计算13. 全球变暖14. 直线15. 平面切分1. 最短路 题目描述&#xff1a; 如下图所示&#xff0c;G是一个无向图&#xff0c;其中蓝色边的长度是…...

yocto 将kernel添加到rootfs

你的消息看起来又是一个搜索查询&#xff0c;关于如何在Yocto项目中将kernel添加到rootfs。根据我的搜索结果⁴&#xff0c;有两种方法可以实现这个目的&#xff1a;- 一种是在rootfs的bb文件中添加kernel-image和kernel-devicetree这两个软件包&#xff0c;这样就可以将内核镜…...

高通 Android10/12 4 6dof Camera+2RGBCamera异常处理经验总结

1 背景&#xff1a;此需求apk距离之前更改时间将近9个月&#xff0c;我们这边原来跟驱动那边对接指令和角度 后续没有改过&#xff0c;测试部说apk cameaid提示信息不正确。 2 原因&#xff1a;因为之前用的1.0基线&#xff08;Android 10) 后面由于客户功能需求变更&#xff…...

项目实战典型案例17——环境混用来带的影响

环境混用来带的影响一&#xff1a;背景介绍背景出现的事故二&#xff1a;思路&方案环境混用的危害如何彻底避免环境混用的问题四&#xff1a;总结五&#xff1a;升华一&#xff1a;背景介绍 本篇博客是对对项目开发中出现的环境混用来带的影响进行的总结并进行的改进。目的…...

Linux【进程理解】

文章目录Linux【进程理解】一、冯诺依曼体系结构二、操作系统OS1.深入理解操作系统2.深入理解系统调用和库函数四、 进程&#xff08;一&#xff09;描述进程-PCB&#xff08;二&#xff09;组织进程和查看进程&#xff08;三&#xff09;通过系统调用创建进程-fork初识&#x…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...