首页 > 编程语言 >java SPI 代码示例

java SPI 代码示例

时间:2024-11-07 14:46:50浏览次数:3  
标签:java SPI 示例 接口 spi test root public

SPI 是 Service Provider Interface 的缩写,中文解释为服务提供发现接口

SPI 是一种「基于接口的编程 + 策略模式 + 配置文件」组合实现的动态加载机制,可以根据逻辑加载不通的接口实现

实现步骤:

  • 在类路径下的 META-INF/services 目录下,创建以服务接口的 "全限定名" 命名的文件,文件的内容为接口实现类的全限定名,每行一个接口实现
  • 实现类必须在当前程序的 classpath 下
  • 使用 java.util.ServiceLoader 动态加载接口实现(ServiceLoader 会自动扫描 META-INF/services 下的配置文件加载实现类)

示例如下:

1、创建接口

package com.test.root.base.spi;

public class FirstSpiService implements SimpleSpiService {
    @Override
    public void say() {
        System.out.println("Say first!");
    }
}

2、实现接口

package com.test.root.base.spi;

public class FirstSpiService implements SimpleSpiService {
    @Override
    public void say() {
        System.out.println("Say first!");
    }
}
package com.test.root.base.spi;

public class SecondSpiService implements SimpleSpiService {
    @Override
    public void say() {
        System.out.println("Say Second!");
    }
}

3、创建 SPI 文件

SPI文件内容

com.test.root.base.spi.FirstSpiService
com.test.root.base.spi.SecondSpiService

2、加载并使用接口实现

package com.test.root.base.spi;

import java.util.ServiceLoader;

public class SpiTest {

    public static void main(String[] args) {
        ServiceLoader<SimpleSpiService> simpleSpiServices = ServiceLoader.load(SimpleSpiService.class);
        for (SimpleSpiService simpleSpiService : simpleSpiServices) {
            simpleSpiService.say();
        }
    }

}

 

标签:java,SPI,示例,接口,spi,test,root,public
From: https://www.cnblogs.com/baokang/p/18532247

相关文章

  • Java并发编程 --- 并发容器
    ConcurrentHashMap基本介绍在JDK1.8中,它的数据结构:Node数组+链表/红黑树初始化/***Initializestable,usingthesizerecordedinsizeCtl.*/privatefinalNode<K,V>[]initTable(){Node<K,V>[]tab;intsc;while((tab=table)==null||tab.length......
  • Maven简单介绍——必要的Java管理与构建
    概念    通常Java的项目中有很多的环境和规范的问题,比如一些需要依赖的包,整个项目的目录标准是怎么样的,什么样的文件放在哪个目录等,还有jdk版本,编译代码流程,项目版本号之类的问题。    虽然这些都是小问题,但是一旦配置起来就会很费时间,这个时候Maven就解决了这样的问题......
  • Java并发编程 --- 线程安全
    为什么会有线程安全问题?为什么会存在线程安全问题呢?那我们先来探究一下JMM(Java内存模型)线程与JMM每个线程都有自己的工作内存,它会存储主内存中变量的Copy值,再对变量进行操作的时候,也是操作工作内存中变量的Copy值。当线程Dead(生命周期结束)时,才会将自己工作内存中的数据同......
  • UE5 GameFeature示例项目《古代山谷(Valley of the Ancient)》中Action_SpawnActor无
    前因最近在研究GameFeature这个功能,UE官方推荐的是《古代山谷》这个项目,因为在其中用到了很多的新功能,GameFeature也在其中。观察到原来的GameFeature默认提供的action中其实功能比较有限,于是就从《古代山谷》拷贝了一些Action来用,结果Action_SpawnActor并无法在我自己的项目中在......
  • 基于SpringBoot的Java教学支持系统开发指南
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理教学辅助平台的相关信息成为必然。开发合适的教学辅助平台,可以方便管理人员对教学辅助平台......
  • SpringBoot Java教学辅助平台:构建高效学习环境
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理教学辅助平台的相关信息成为必然。开发合适的教学辅助平台,可以方便管理人员对教学辅助平台......
  • 从Samza到Flink:Java实现数据流转换
    标题:从Samza到Flink:Java实现数据流转换摘要:本文将介绍如何使用Java语言实现将数据流从Samza转换为Flink的过程。通过使用Flink的丰富功能和优化技术,我们可以轻松处理大规模数据流,并实现精确和高效的数据处理。引言Samza和Flink是两个非常流行的分布式数据处理框架,它们都......
  • Java深度优先搜索(DFS)算法实现
    标题:Java深度优先搜索(DFS)算法实现引言:深度优先搜索(Depth-FirstSearch,DFS)是一种常用的图遍历算法,它通过递归地遍历图中的每个顶点,来寻找特定的路径或解决某些问题。本篇博客将介绍如何用Java语言实现深度优先搜索算法。算法思想:深度优先搜索算法的基本思想是先访问一个......
  • java后端工程师转行AI大模型岗,工作、自我提升两不误!
    随着技术的不断进步,人工智能(AI)已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域,如Java,转向人工智能领域,今天小编和大家一起来探讨Java开发者是否可以转型到人工智能,转型的优势,薪资对比,以及转型所需的知识和学习路线等。01Java开发者能否转......
  • Java(Spring Boot)项目通过 GitHub Actions 流水线实现自动化构建部署
    前两次分享了前端(Vue)项目的自动化构建和 Rust项目的自动化构建,本次就分享JavaSpringBoot项目的自动化构建并部署,部署时需要一台已安装JDK17及以上的Linux服务器。1.新建流水线构建文件在项目的根目录下新建.github/workflows文件夹并在文件夹下新建deploy.yml......