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

[Java]SPI扩展功能

一、什么是SPI

Java SPI(Service Provider Interface)是Java官方提供的一种服务发现机制。
它允许在运行时动态地加载实现特定接口的类,而不需要在代码中显式地指定该类,从而实现解耦和灵活性。

二、实现原理

基于 Java 类加载机制和反射机制。

存在
开始
加载服务
ServiceLoader.load, 参数Class
检测META-INF/services文件夹
是否存在
接口全限定名命名
的文件
获取文件内
实现类的全限定名
反射创建
结束

三、优点

  • 松耦合性:具有很好的松耦合性,可以在运行时动态加载实现类,而无需在编译时将实现类硬编码到代码中。
  • 扩展性:可以为同一个接口定义多个实现类,使应用程序更容易扩展和适应变化。
  • 易于使用:只需要定义接口并指定实现类的类名,即可轻松地使用新的服务提供者。

四、使用

我的服务

新建接口

这个接口要给SPI实现者

package com.example.demo;
public interface Phone {void print();
}

使用

public static void main(String[] args) {ServiceLoader<Phone> phones = ServiceLoader.load(Phone.class);for (Phone phone:phones) {phone.print();}
}

这是时候我们还没有任何实现类。
所以ServiceLoader是加载不到的。
我们需要另一个服务去实现配置Phone接口,并引入另一个服务的依赖

其他的服务实现接口

另一个服务实现配置Phone接口

package com.example.demo2;public class HuaweiPhone implements Phone {@Overridepublic void print() {System.out.println("遥遥领先?");}
}

实现接口2

package com.example.demo2;
public class XiaomiPhone implements Phone{@Overridepublic void print() {System.out.println("Are you ok?");}
}

在META-INF/services创建配置

创建com.example.demo.Phone的文件
内容:

com.example.demo2.HuaweiPhone
com.example.demo2.XiaomiPhone

http://www.lryc.cn/news/191972.html

相关文章:

  • 机器人命令表设计
  • STM32--WDG看门狗
  • (※)力扣刷题-字符串-实现 strStr()(KMP算法)
  • Redis 集群 Redis 事务 Redis 流水线 Redis 发布订阅 Redis Lua脚本操作
  • 【算法与数据结构】--常见数据结构--栈和队列
  • Linux shell编程学习笔记11:关系运算
  • JS标准库
  • Android 12.0 hal层添加自定义hal模块功能实现
  • 如何理解vue声明式渲染
  • 【已解决】Vue全局引入scss 个别页面不生效 / 不自动引入全局样式
  • MySQL之双主双从读写分离
  • 使用eBPF加速阿里云服务网格ASM
  • 大型数据集处理之道:深入了解Hadoop及MapReduce原理
  • LCR 095. 最长公共子序列(C语言+动态规划)
  • 程序员不写注释:探讨与反思
  • 《论文阅读:Dataset Condensation with Distribution Matching》
  • 免费chatGPT工具
  • 数据分析基础:数据可视化+数据分析报告
  • settings.xml的文件配置大全
  • 极简c++(7)类的继承
  • DOSBox和MASM汇编开发环境搭建
  • 047:mapboxGL本地上传shp文件,在map上解析显示图形
  • Windows下DataGrip连接Hive
  • Xshell7和Xftp7超详细下载教程(包括安装及连接服务器附安装包)
  • ASP.net数据从Controller传递到视图
  • c++ 友元函数 友元类
  • Spring推断构造器源码分析
  • 十五、【历史记录画笔工具组】
  • Spark上使用pandas API快速入门
  • 【WebRTC---源码篇】(十:零)WEBRTC/StreamStatisticianImpl持续更新中)