当前位置: 首页 > 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/路径下建立文件,文件名为目标接口全限定名;文件内容为实现目标接口的具体实现类全限定名。
http://www.lryc.cn/news/31544.html

相关文章:

  • vue实现输入框中输完后光标自动跳到下一个输入框中
  • 如何构建 C 语言编译环境?
  • 电子台账:模板制作之一——列过滤(水平过滤)
  • 【java】Java连接mysql数据库及mysql驱动jar包下载和使用
  • Mysql八股文
  • 解析Android ANR问题
  • ESP32设备驱动-MicroSD Card驱动
  • XC7K160T-1FBG484I、XC7A100T-2CSG324I FPGA可编程门阵列 PDF规格书
  • 基于HD-RK3568-IO评估板的读写速度测试报告
  • jconsole远程linux下的tomcat
  • Redis和MySQL如何保持数据一致性?
  • 频谱分析仪的工作原理
  • docker项目自动化部署脚本(认真排版、工作积累)
  • 【经验分享】使用了6年的实时操作系统,是时候梳理一下它的知识点了 | 文末赠书4本
  • 蓝桥杯C/C++程序设计 往届真题汇总(进阶篇)
  • yocto 将kernel添加到rootfs
  • 高通 Android10/12 4 6dof Camera+2RGBCamera异常处理经验总结
  • 项目实战典型案例17——环境混用来带的影响
  • Linux【进程理解】
  • 【华为OD机试2023】数组的中心位置 C++ Java Python
  • “大数据时代下的地理信息可视化:ECharts地图和数据面板实践“
  • MySQL数据库基础
  • 近自由电子近似
  • 【JavaWeb】从输入URL到展示出页面的过程
  • 华为OD机试真题Java实现【数字涂色】真题+解题思路+代码(20222023)
  • Log Structure Merge Tree
  • Python QT5设计UI界面教程
  • uniapp系列-图文并茂手把手教你hbuilder进行uniapp云端打包 - 安心打包
  • 【精品】SpringBoot中基于拦截器实现登录验证功能
  • 哈工大服务科学与工程第一章作业