Java SPI机制

Java SPI

Java SPI(Service Provider Interface)是一种在 Java 中实现插件化架构的机制。
SPI 允许开发者定义服务接口,然后实现这些服务接口的不同提供者,使得应用程序在不修改源代码的情况下可以动态地加载、使用不同的服务提供者。
这种机制非常适合于框架和库,因为它允许开发者为特定的功能提供多个实现,而应用程序可以在运行时选择合适的实现。
Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦

当服务的提供者提供了一种接口的实现之后,需要在**classpath下的META-INF/services/**目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader

SPI实现示例

以下是一个简单的 Java SPI 示例,假设我们有一个服务接口 MyService,以及两个不同的实现提供者 MyServiceImpl1 和 MyServiceImpl2。

1、创建服务接口 MyService

public interface MyService {void doSomething();
}

2、创建两个实现提供者,MyServiceImpl1 和 MyServiceImpl2

public class MyServiceImpl1 implements MyService {@Overridepublic void doSomething() {System.out.println("MyServiceImpl1 is doing something.");}
}
public class MyServiceImpl2 implements MyService {@Overridepublic void doSomething() {System.out.println("MyServiceImpl2 is doing something.");}
}

3、创建 META-INF/services 目录,用于存放服务提供者配置文件。

4、在 META-INF/services 目录下创建一个名为 限定类名MyService 的文件,其中包含服务提供者的类名:

在这里插入图片描述在这里插入图片描述

5、创建应用程序代码,使用 SPI 加载并使用服务提供者

package com.lf.java.basic.spi;import java.util.ServiceLoader;public class ServiceLoaderTest {public static void main(String[] args) {ServiceLoader<MyService> serviceLoader = ServiceLoader.load(MyService.class);for (MyService service : serviceLoader) {service.doSomething();}}
}

运行结果:

在这里插入图片描述
在这个示例中,ServiceLoader 用于加载 MyService 的实现提供者,并调用它们的 doSomething 方法。应用程序不需要知道有哪些具体实现,它们会在运行时动态加载。

确保在编译和运行时正确设置类路径,以便能够找到服务提供者的实现类。这个示例演示了 Java SPI 的基本用法,可以用于更复杂的插件化架构,允许动态地添加、删除或替换服务提供者。

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

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

相关文章

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

vue上传宝塔退出页面404

当我们将vue上传到服务器上点击退出时出现页面404时。 如何解决&#xff1a; 1.如果是element plus框架时&#xff1a; 找到layouts文件里面的components文件下Avatar中的index.vue. 2.添加重新加载&#xff1a;location.reload(); 如果是其他的框架同上 。

要在CentOS中安装Docker

Docker部署 在CentOS中安装Docker要在CentOS中安装Docker&#xff0c;请按照以下步骤进行操作&#xff1a;启动和校验常用命令查看容器启动容器 配置镜像加速 在CentOS中安装Docker 要在CentOS中安装Docker&#xff0c;请按照以下步骤进行操作&#xff1a; 首先&#xff0c;确…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

计算机网络第4章-IPv6和寻址

IP地址的分配 为了获取一块IP地址用于一个组织的子网内&#xff0c;于是我们向ISP联系&#xff0c;ISP则会从已分给我们的更大 地址块中提供一些地址。 例如&#xff0c;ISP也许已经分配了地址块200.23.16.0/20。 该ISP可以依次将该地址块分成8个长度相等的连续地址块&…

汉化程序的使用方法

首先&#xff1a;双击打开安装程序&#xff0c;输入密码

相机滤镜软件Nevercenter CameraBag Photo mac中文版特点介绍

Nevercenter CameraBag Photo mac是一款相机和滤镜应用程序&#xff0c;它提供了一系列先进的滤镜、调整工具和预设&#xff0c;可以帮助用户快速地优化和编辑照片。 Nevercenter CameraBag Photo mac软件特点介绍 1. 滤镜&#xff1a;Nevercenter CameraBag Photo提供了超过2…

矩阵乘积的迹对矩阵求导

矩阵A、B乘积的迹对矩阵A求导 下面来证明。

Stable Diffusion源码调试(一)

Stable Diffusion源码调试&#xff08;一&#xff09; 个人模型主页&#xff1a;https://liblib.ai/userpage/369b11c9952245e28ea8d107ed9c2746/model Stable Diffusion版本&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.4.1 调试t…

Leetcode 第 368 场周赛题解

Leetcode 第 368 场周赛题解 Leetcode 第 368 场周赛题解题目1&#xff1a;2908. 元素和最小的山形三元组 I思路代码复杂度分析 题目2&#xff1a;2909. 元素和最小的山形三元组 II思路代码复杂度分析 题目3&#xff1a;2910. 合法分组的最少组数思路代码复杂度分析 题目4&…

Maven3.9.1安装及环境变量配置

一、Maven的下载与安装 maven各版本下载地址 打开链接后自行选择对应版本 下载完成后解压安装,最好别选择c盘,安装目录路径等使用英文,避免产生其他问题 我这里选择的是D盘 二、Maven的环境变量配置 2.1、右键点击此电脑选择属性&#xff0c;点击高级系统设置&#xff0c;点…

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…