JDK-SPI-服务提供者接口

归档

  • GitHub: JDK-SPI-服务提供者接口

SPI 源码说明

  • java.util.ServiceLoader
/*** 服务加载器:给定接口,查找实现类。实现可迭代接口 */
public final class ServiceLoader<S> implements Iterable<S> {/*** 返回 ServiceLoader 实例 */public static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader) {return new ServiceLoader<>(service, loader);}/*** 构造器 */private ServiceLoader(Class<S> svc, ClassLoader cl) {// 记录要查找的接口类service = Objects.requireNonNull(svc, "Service interface cannot be null");// 记录加载器loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl;...reload(); // (重新)加载}/*** 重新加载 */public void reload() {providers.clear(); // 清空lookupIterator = new LazyIterator(service, loader); // 创建懒加载迭代器}/*** 实现可迭代接口:返回迭代器 */@Overridepublic Iterator<S> iterator() {/*** 一个新的迭代器实现。对懒加载迭代器 lookupIterator 进行封装 */return new Iterator<S>() {Iterator<Map.Entry<String, S>> knownProviders = providers.entrySet().iterator();...public S next() { // 先从已加载的里面选if (knownProviders.hasNext())return knownProviders.next().getValue();return lookupIterator.next(); // 最后才开始加载}...};}}
  • java.util.ServiceLoader.LazyIterator
    /*** 懒加载-迭代器。实现迭代器接口 */private class LazyIterator implements Iterator<S> {/*** 构造器 */private LazyIterator(Class<S> service, ClassLoader loader) {this.service = service;this.loader = loader;}/*** 获取下一个服务实现对象 */public S next() {if (acc == null) {return nextService(); // 获取下一个服务实现对象} ...}/*** 获取下一个服务实现对象 */private S nextService() {...String cn = nextName; // 下一个服务实现类的类名。nextName 在 hasNextService() 方法里面设置Class<?> c = null;try {c = Class.forName(cn, false, loader); // 初始化类} catch (ClassNotFoundException x) {...}...try {S p = service.cast(c.newInstance()); // 实例化一个对象providers.put(cn, p); // 添加到提供者(providers)Map 里,方便上面的判断return p;}...}/*** 判断是否有下一个服务 */private boolean hasNextService() {...if (configs == null) {try {// String PREFIX = "META-INF/services/";String fullName = PREFIX + service.getName();...configs = loader.getResources(fullName); // 加载所有的文件} ...}while ((pending == null) || !pending.hasNext()) {if (!configs.hasMoreElements()) {return false;}pending = parse(service, configs.nextElement()); // 逐个文件加载填充 pending}nextName = pending.next(); // 设置下一个要加载的类的类名return true;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剪画小程序:自媒体工具推荐:视频文案提取!

各位小伙伴&#xff0c;你们好啊&#xff01; 上周五观看《歌手 2024》第八期时&#xff0c;我再次被何炅老师幽默风趣的主持风格所折服。他的每一句话都仿佛带着魔力&#xff0c;让现场气氛热烈非凡&#xff0c;实在令人羡慕不已&#xff01; 何炅老师的口才之所以如此出色&a…

如何在 Ubuntu上搭建 LAMP

远程登录 Ubuntu系统环境 ssh (User)(IP) # 比如&#xff1a;ssh lennlouis192.168.207.128 为安全起见&#xff0c;建议你使用 root 登录 VPS 后创建一个具有 sudo 权限的帐号。 安装和配置 Apache 2 Apache Http Server 是一个开源的&#xff0c;非常流行&#xff0c;使用…

【Unity小知识】UnityEngine.UI程序集丢失的问题

问题表现 先来说一下问题的表现&#xff0c;今天在开发的时候工程突然出现了报错&#xff0c;编辑器提示UnityEngine.UI缺少程序集引用。 问题分析与解决&#xff08;一&#xff09; 既然是程序集缺失&#xff0c;我们首先查看一下工程项目是否引用了程序集。在项目引用中查找一…

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理

一、背景 随着城市化进程的加快&#xff0c;越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时&#xff0c;也伴随着一定的安全隐患。尤其是在一些危险水域&#xff0c;也经常出现垂钓者的身影&#xff0c;非法垂钓&#xff0c;这给城市管理带来了不小的阻力。传统的人…

Java传引用问题

本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况&#xff1a; 通过引用修改当前引用的指向 通过引用修改原来指…

华为OD机试2024年最新题库 JAVA C卷+D卷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

统一视频接入平台LntonCVS视频监控平台具体功能介绍

LntonCVS视频监控平台是一款基于H5技术开发的安防视频监控解决方案&#xff0c;专为全球范围内不同品牌、协议及设备类型的监控产品设计。该平台提供了统一接入管理&#xff0c;支持标准的H5播放接口&#xff0c;使其他应用平台能够快速集成视频功能。无论开发环境、操作系统或…

Rufus 制作 Ubuntu 启动盘 | 开启便携的工作空间

唠唠闲话 最近服务器硬盘故障多&#xff0c;在修复过程中&#xff0c;学习了一些操作&#xff0c;这里做个记录。本期主要介绍 U盘启动盘的制作&#xff0c;以及持久化存储。 U 盘启动盘 镜像选择 Ubuntu 的版本命名遵循 “Adjective Animal” 的模式&#xff0c;即 “形容…

关于Wav2Lip配置实现

模型介绍 Wav2Lip是一种先进的深度学习模型&#xff0c;旨在将音频波形直接转换为面部动画&#xff0c;尤其关注于唇部动作的生成与同步。这一技术的核心在于其能够利用输入的语音信号&#xff0c;生成与之高度匹配的嘴唇动作&#xff0c;从而实现逼真的语音驱动数字人物动画效…

electron-vue自定义标题

1.在主进程background.js或者main.js中主窗口配置frame: false async function createWindow() {Menu.setApplicationMenu(null);// Create the browser window.const win new BrowserWindow({width: 1000,height: 600,resizable: false,frame: false,webPreferences: {nodeI…

VMware替换关键技术:核心业务系统中,访存密集型应用的性能优化

越来越多用户采用虚拟化、超融合以及云平台环境来承载其核心业务&#xff0c;核心业务的高并发对性能的要求尤为严格&#xff0c;在VMware替换的热潮下&#xff0c;原VMware用户也更为关注新平台在核心业务上的性能表现是否对标&#xff0c;或实现超越。深信服将通过系列解析&a…

Servlet与Servlet容器

什么是Servlet? Servlet是Java EE&#xff08;现称Jakarta EE&#xff09;中的一个组件&#xff0c;通常用于创建动态Web内容。Servlet是运行在Web服务器上的Java程序&#xff0c;它处理客户端的请求并生成响应。Servlet的核心功能是处理HTTP请求和响应。下面是一个servlet例…

视频编辑和视频剪辑有什么区别 视频编辑怎么旋转方向 会声会影视频制作教程下载 视频剪辑软件免费下载中文版 视频剪辑用哪个软件

如果你还分不清视频编辑与视频剪辑&#xff0c;请务必仔细阅读本文&#xff0c;了解二者之间的不同。本文还将重点介绍&#xff0c;旋转视频方向的三种常用方法&#xff0c;手把手地教你如何旋转视频方向。有关视频编辑和视频剪辑有什么区别&#xff0c;视频编辑怎么旋转方向的…

出海拓圈! 环保企业走出去之马来西亚水环境项目考察

中办、国办印发《关于构建现代环境治理体系的指导意见》&#xff0c;其中明确提出“鼓励企业参与绿色‘一带一路’建设&#xff0c;带动先进的环保技术、装备、产能走出去”。近年来中国积极参与全球生态环境治理&#xff0c;在环境资源综合管理、水旱灾害防御、固危废无害化处…

亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案

在现代企业的竞争中&#xff0c;信息化建设扮演着越来越重要的角色。信息化技术不仅是企业提升管理效率、优化运营模式的利器&#xff0c;更是企业在市场竞争中脱颖而出的关键。然而&#xff0c;许多企业在推进信息化的过程中&#xff0c;往往容易陷入“面子工程”的误区。那么…

Windows 玩转大模型第二天:流式输出和角色扮演(提示词)(全部代码和详细部署流程)

Windows 玩转大模型第一天&#xff1a;大模型本地部署&#xff0c;调用大模型API可直接工程化应用&#xff08;全部代码和详细部署流程&#xff09;-CSDN博客 流式输出是指模型在生成内容时不是一次性输出全部结果&#xff0c;而是逐步、连续地生成输出。这种方式类似于人类在…

使用笔记之-E语言微信支付支付宝支付源代码

首先下载E语言微信支付&支付宝支付源代码 http://www.htsoft.com.cn/download/E_WeiXin_ZhiFuBao_ZhiFu.rar

【EI会议/稳定检索】2024年农业发展与机械应用国际会议(ADMA 2024)

2024 International Conference on Agricultural Development and Mechanical Applications 2024年农业发展与机械应用国际会议 【会议信息】 会议简称&#xff1a;ADMA 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;中国武汉 会议官…

python作业一

1. #A.方法一 num int(input("请输入要打印的层数:")) for n in range(1, num1):s ""for i in range(1, n1):s f"{i}" " "print(s) #方法二&#xff1a; iint(input("i:")) for i in range(1,i1):s""for j i…

南方健康2024米思会:科普患教赋能医药增长闭环,千亿蓝海市场大爆发!

2024年6月25日-28日&#xff0c;在中国•南太湖举办的2024米思会如约而至&#xff0c;顺利落下帷幕&#xff0c;本次大会以“韧进启新局”为主题&#xff0c;以不懈进取的“韧劲”&#xff0c;立身破局&#xff0c;迎变启新。通过4天3夜的思想碰撞和互动交流&#xff0c;引领行…