Java SPI加载机制

news2024/12/27 10:59:40

SPI加载机制

SPI(Service Provider Interface)是一种通过外界配置来加载具体代码内容的技术手段。SPI是JDK内置的一种服务提供发现机制,用于实现框架的扩展和组件替换。

在SPI中,框架提供一整套接口,使用者实现这些接口后,在classpath的目录META-INF/services/下创建以该接口命名的文件,并在该接口中写下实现类的全包名,SPI的加载机制则会加载该文件中类名对应的类。

下面是一个简单样例
首先定义一个接口

package cn.bobasyu.spi;

public interface ISpiTest {
    void test();
}

然后是这个接口的实现类

package cn.bobasyu.spi.impl;

import cn.bobasyu.spi.ISpiTest;

public class ASpiTestImpl implements ISpiTest {
    @Override
    public void test() {
        System.out.println("Hello A!");
    }
}

package cn.bobasyu.spi.impl;

import cn.bobasyu.spi.ISpiTest;

public class BSpiTestImpl implements ISpiTest {
    @Override
    public void test() {
        System.out.println("Hello B!");
    }
}

接着如前面所述的,在lasspath的目录META-INF/services/下创建以该接口命名的文件,并在该文件中写入两个实现类的名称

SPI

文件中的内容:

cn.bobasyu.spi.impl.ASpiTestImpl
cn.bobasyu.spi.impl.BSpiTestImpl

在运行时,使用ADK自带的ServiceLoader进行加载,即可读取文件中的类名并加载好对应的对象

    @Test
    public void spiLoadTest() {
        ServiceLoader<ISpiTest> serviceLoader = ServiceLoader.load(ISpiTest.class);
        for (ISpiTest spiTest : serviceLoader) {
            spiTest.test();
        }
    }

SPI在许多地方都有使用,比如在JDBC中,定义了java.sql.Driver接口,接下来针对每个数据库的具体实现需要在META-INF/services/中放入相应的文件,下面是mysql中的例子

SPI

文件中的内容:

SPI

使用SPI可以实现框架设计者和具体使用者间的解耦,在进行系统架构设计时,只关注抽象的部分,而框架的使用者则可以根据自己的需求进行自定义的扩展,其体现的是数据模式中的桥接模式,抽象部分与实现部分分离。

SPI桥接模式

角色名含义
抽象化(Abstraction)角色抽象化给出的定义,并保存一个对实现化对象的引用
修正抽象化(RefinedAbstraction)角色扩展抽象化角色,改变和修正父类对抽象化的定义
实现化(Implementor)角色这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作
具体实现化(ConcreteImplementor)角色这个角色给出实现化角色接口的具体实现

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

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

相关文章

Android Studio实现解析HTML获取图片URL,将URL存到list,进行列表展示

目录 效果build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误代码activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL效果 build.gradle(app)添加的依赖(用不上的可以不加) dependencies {implementation com.square…

信息安全:VPN 技术原理与应用.

信息安全&#xff1a;VPN 技术原理与应用. VPN 是网络通信安全保护的常用技术。VPN 中文翻译为“虚拟专用网”&#xff0c;其基本技术原理是把需要经过公共网传递的报文 (packet) 加密处理后&#xff0c;再由公共网络发送到目的地。利用VPN 技术能够在不可信任的公共网络上构建…

PDF怎么转Word?8 个最佳 PDF 转 Word 转换器

PDF 转 Word 转换工具只是一个特殊程序&#xff0c;可以将 PDF&#xff08;本机和/或扫描&#xff09;转换为 Microsoft Office Word 格式。将 PDF 导出到 Word 的主要原因之一是满足可编辑文档的需求&#xff0c;尽管还有其他原因。 由于缺少 PDF 阅读器&#xff0c;您可以选…

实用的开源应用全新开源源码Vue3+TS的前后台分离的开发平台源码开源技术社区平台

开源全新开源源码Vue3TS的前后台分离的开发平台源码。创意、新奇、有趣、实用的开源应用、系统、软件、硬件及技术&#xff0c;一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区&#xff0c;共建开源新生态&#xff01; 功能简介 个人办公&a…

python的进度条tqdm库,显示时进度条不换行设置

问题描述 tqdm库&#xff0c;显示时进度条不要换行&#xff0c;直接在一行里显示当前进度 换行显示&#xff1a; 不换行显示 解决方案&#xff08;参考链接&#xff09; 添加参数position0 和 leaveTrue 举例&#xff1a; 修改前&#xff1a; import tqdm import time f…

树莓派上搭建WordPress博客网站,并通过内网穿透发布到公网

文章目录 概述安装 PHP安装MySQL数据库安装 Wordpress设置您的 WordPress 数据库设置 MySQL/MariaDB创建 WordPress 数据库 WordPress configuration将WordPress站点发布到公网安装相对URL插件修改config.php配置 支持好友链接样式定制主题 概述 在本次教程里&#xff0c;我们…

Markdown 入门基础

文章目录 Markdown 是什么&#xff1f;为什么要使用 Markdown?工欲善其事&#xff0c;必先利其器Markdown 的工作原理Markdown 有什么用&#xff1f;网站文件资料笔记书籍演示文稿邮件文档 Markdown 方言其它资源 Markdown 是什么&#xff1f; Markdown 是一种轻量级的标记语…

【Docker报错】docker拉取镜像时报错:no such host

报错信息 [rootSoft soft]# docker pull mysql Using default tag: latest Error response from daemon: Head "https://registry-1.docker.io/v2/library/mysql/manifests/latest": dial tcp: lookup registry-1.docker.io on 192.168.80.2:53: no such host解决方法…

ogg格式怎么转换为mp3?

ogg格式怎么转换为mp3&#xff1f;我们都知道&#xff0c;OGG格式作为一种数字饮片格式&#xff0c;使用的是有损压缩技术&#xff0c;从而也保证了文件音质较高。然而&#xff0c;也正是因为这个特点&#xff0c;导致OGG格式文件较大。很多时候&#xff0c;我们在使用OGG格式文…

内网穿透-外远程连接中的RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

日志系统——日志格式化模块设计

一&#xff0c;模块主要成员 该模块的主要作用是对日志消息进行格式化&#xff0c;将日志消息组织成制定格式的字符串。 该模块主要成员有两个&#xff1a;1.格式化字符串。 2.格式化子项数组 1.1 格式化字符串 格式化字符串的主要功能是保存日志输出的格式字符串。其格式化字…

网络安全/黑客技术(就业前景与经验分享)

网络安全与我们每一个人都息息相关&#xff0c;无论是企业还是个人&#xff0c;现在都非常重视网络安全。而且网络安全是一个新兴的行业&#xff0c;人才需求量远远大于供给&#xff0c;所以在薪资福利上具有很大的优势&#xff0c;并且对于初学者而言&#xff0c;很多人依旧担…

ThreadPool线程池

文章目录 一.概述和架构二.使用方式和底层原理三.七个参数介绍四.工作流程和拒绝策略五.自定义线程池 一.概述和架构 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在短时间…

文件名称是递增的,删除掉其中一部分的文件,导致递增文件缺少,通过python查找出缺少的递增文件名称

文件名称是递增的&#xff0c;删除掉其中一部分的文件&#xff0c;导致递增文件缺少&#xff0c;通过python查找出缺少的递增文件名称 通过python,查找出缺少的递增的文件的名称&#xff1a; 代码如下&#xff1a; import osdef find_missing_numbers(folder_path):file_list …

6000万美元?通用汽车投资初创新贵Mitra,开发“经济型电池”

根据最新消息&#xff0c;通用汽车公司日前宣布领导一轮6000万美元的B轮融资&#xff0c;投资对象为电池材料初创公司Mitra Chem。此次投资旨在帮助通用汽车改进未来电动汽车的电池制造&#xff0c;使其更加经济实惠且易获取。 目前&#xff0c;大多数电池使用的是镍和钴的制造…

linux系统--makefile文件,gdb 以及文件描述符

目录 1 makefile 1.1 makefile的基本规则 1.2 makefile工作原理 1.3 makefile中的变量 1.4 makefile函数 1.5 makefile的清理操作 2 gdb调试 2.1 gdb介绍 2.2 生成调试信息 2.3 启动gdb 2.4 显示源代码 3文件IO 3.1 C库IO函数的工作流程 3.2 C库函数与系统函数的…

Sigmastar SSC8826Q 2K行车记录仪解决方案

一、方案描述 行车记录仪是智能辅助汽车驾驶&#xff0c;和管理行车生活的车联网智能终端设备&#xff0c;利用智能芯片处理器、GPS定位、网络通信、自动控制等技术&#xff0c;将与行车生活有关的各项数据有机地结合在一起。 行车记录仪如今已经成了必不可少的车载用品之一&…

用栈解决有效的括号匹配问题

//用数组实现栈 typedef char DataType; typedef struct stack {DataType* a;//动态数组int top;//栈顶int capacity; //容量 }ST;void STInit(ST*pst);//初始化void STDestroy(ST* pst);//销毁所有空间void STPush(ST* pst, DataType x);//插入数据到栈中void STPop(ST* pst);…

开学有什么平替电容笔值得买?比较好用的ipad手写笔

相信不少的学生党都已经在开学前入手了iPad&#xff0c;而现在&#xff0c;电容笔作为iPad的一种主要配件&#xff0c;其的性能也在不断地提高&#xff0c;使用电容笔的用户也在不断地增加。因此&#xff0c;如何挑选一款物美价廉的电容笔成为大家最关心的问题。那么&#xff0…

C/C++ : C/C++的详解,C语言与C++的常用算法以及算法的各自用法和应用(初级,中级),C++ CSP考题(J居多,S偏少)的详解,NOI的真题题解

目录 1.C语言 2.C 3.C与C语言的共同/不同点 4.导读 5.相关文章 5.1&#xff1a;Dev-C是Windows 环境下的一个轻量级 C/C 集成开发环境&#xff08;IDE&#xff09; 5.2&#xff1a;C是从C语言发展而来的&#xff0c;而C语言的历史可以追溯到1969年 6.C/C最新年度总…