Java SPI机制的示例分析
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这期内容当中小编将会给大家带来有关Java SPI机制的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在平时开发项目的过程中,相信很多读者都看到过这样的目录
千家信息网最后更新 2025年02月06日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) {
ServiceLoader
loader= ServiceLoader.load(GreetingService.class); Iterator
greetingIter = 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安全错误
数据库的锁怎样保障安全
服务器磁盘清理工具
对软件开发项目的了解
本地服务器推送代码
怀旧服服务器状态查询软件
苹果qq购买会员连接不上服务器
ice服务器真实情况
python kv数据库
互联网科技公司成本
监控总显示登陆服务器超时
华为谷歌服务器干嘛的
永定河数据库
网络服务器被关了
空间数据库发展经历了几个阶段
学生网络安全教育周末安全
楚雄手机软件开发
东营采购软件开发定制
杭州游卡网络技术有限公司
信息空间与网络技术
计算机网络技术中专
app软件开发师任职要求
广东数据库安全审计
我爱我家有凶宅数据库吗
如何开启网络安全智能时代
部队网络安全防范六有
db2数据库连接配置
拼多多软件开发类目保证金
飞腾2500服务器是哪公司的
软件开发 设备使用费
智云互联显示服务器超时
iis服务器404