Java SPI机制的示例分析
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这期内容当中小编将会给大家带来有关Java SPI机制的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在平时开发项目的过程中,相信很多读者都看到过这样的目录
千家信息网最后更新 2025年11月15日Java SPI机制的示例分析在平时开发项目的过程中,相信很多读者都看到过这样的目录,/META-INF/services目录,该目录下的文件名是接口的全称,其内容是具体的接口实现。这就是使用了SPI机制。如:
SPI全称为 Service Provicder Interface,是JDK内置的一种服务提供发现功能,一种动态替换发现的机制。 举个例子,要想在运行时动态给一个接口添加实现,只需要添加一个实现即可。比如JDBC的数据库驱动模块,不同数据库连接驱动接口相同但实现类不同,通常各大厂商(如Mysql、Oracle)会根据一个统一的规范(java.sql.Driver)开发各自的驱动实现逻辑。客户端使用jdbc时不需要去改变代码,直接引入不同的spi接口服务即可。
使用SPI也需要遵循一定的规范,主要包含如下几点:
当执行ServiceLoader.load(GreetingService.class)构造完ServiceLoader实例我们可以看到这个时lookupIterator1的值还是null的。这个时候还没有去读取配置文件中的实现类信息。 当使用迭代器去遍历的时候,才会读取对应的配置文件去解析,调用hasNext方法的时候会去加载配置文件进行解析。文件读取采用BufferedReader的readLine来读取并解析。 从上述的示例可以看出:虽然ServiceLoader也算是使用的延迟加载,但是需要通过迭代器迭代获取 ,所有配置的实现类都要实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。
这期内容当中小编将会给大家带来有关Java SPI机制的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
mysql-connector
JDK中的nio SPI
再如,logback-classic
接下来,我们就来聊聊java SPI机制
一、SPI概念和规范
1.1 SPI概念
1.2 SPI规范
需要设置/META-INF/目录
/META-INF/services
放到classpath下
/META-INF/services/目录下放置配置文件
文件名是接口全路径名
文件内部是要实现的接口实现类
文件编码为UTF-8
使用ServiceLoad的load方法
二、SPI示例
编写一个GreetingService接口
package com.wangmengjun.tutorial.spi;public interface GreetingService {void sayHello();}
编写2个实现类,分别输出英文和中文
package com.wangmengjun.tutorial.spi.impl;import com.wangmengjun.tutorial.spi.GreetingService;public class EnglishGreetingServiceImpl implements GreetingService{public void sayHello() {System.out.println("Hello , This is SPI");}}
package com.wangmengjun.tutorial.spi.impl;import com.wangmengjun.tutorial.spi.GreetingService;public class ChineseGreetingServiceImpl implements GreetingService {public void sayHello() {System.out.println("你好,这是SPI");}}
创建META-INF文件目录并设置实现类
使用ServiceLoader
package com.wangmengjun.tutorial.spi;import java.util.Iterator;import java.util.ServiceLoader;public class SpiMain {public static void main(String[] args) {ServiceLoaderloader= ServiceLoader.load(GreetingService.class); IteratorgreetingIter = loader.iterator(); while(greetingIter.hasNext()) {GreetingService service= greetingIter.next();System.out.println(service.getClass().getName());service.sayHello();}}}
输出:
com.wangmengjun.tutorial.spi.impl.EnglishGreetingServiceImplHello , This is SPIcom.wangmengjun.tutorial.spi.impl.ChineseGreetingServiceImpl你好,这是SPI
经过上述几个步骤,一个spi的简单示例就完成了。
// The lazy-lookup iterator for iterator operations private Iterator> lookupIterator1; private final List instantiatedProviders = new ArrayList<>();
上述就是小编为大家分享的Java SPI机制的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
文件
接口
目录
机制
示例
配置
分析
不同
内容
实例
时候
迭代
驱动
你好
全称
动态
就是
数据
数据库
文件名
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
测序的原始数据库上传
查询数据库数据封装集合
上海地区的网络安全个股
珠海蓁奕互联网科技
下面哪个数据库不是全文数据库
toad数据库登录
软件开发保密协议有用吗
数据库清空一个表可以用哪个操作
网络安全上岗有效期
柳职计算机网络技术
搅拌站控制系统软件开发
cs起源国内服务器
软件开发部门半年工作总结
服务器的机箱能买吗
评论回复数据库表设计
网络安全需要编程语言
蓬莱微信小程序软件开发解决方案
上海排名前十的网络技术公司
中国cnm网络安全小组
原型方式软件开发实例
惠泽网络技术有限公司
店铺下的三级类目数据库设计
数据库技术应用有什么
儿童网络安全腾讯罗雯
自己做数据库读写分离
网络安全日常管理总结
福建网络技术咨询机构
杭州软件开发者有什么途径
软件开发效率
一站网络技术有限公司怎么样