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

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;}}

相关文章:

JDK-SPI-服务提供者接口

归档 GitHub: JDK-SPI-服务提供者接口 SPI 源码说明 java.util.ServiceLoader /*** 服务加载器&#xff1a;给定接口&#xff0c;查找实现类。实现可迭代接口 */ public final class ServiceLoader<S> implements Iterable<S> {/*** 返回 ServiceLoader 实例 *…...

【docker】容器内配置环境变量

背景&#xff1a; 我要把下面的环境变量写到bash脚本里&#xff0c;起名叫environment_start.sh。 目的&#xff1a; 用于每次进入容器dev_into.sh的时候&#xff0c;让系统获取到环境变量。 操作步骤&#xff1a; 先在容器外找个合适的位置写环境变量bash脚本&#xff0c…...

Java 乐观锁与悲观锁

1. 前言 本节内容主要是对 Java 乐观锁与悲观锁进行更加深入的讲解,本节内容更加偏重于对乐观锁的讲解,因为 synchronized 悲观锁对于大部分学习者并不陌生,本节主要内容如下: 乐观锁与悲观锁的概念,之前有所讲解,这里用很小的篇幅进行知识的回顾,巩固;乐观锁与悲观锁…...

python学习2-数据结构与算法-链表

单链表是一种链式存取的数据结构&#xff0c;用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的&#xff0c;每个结点的构成&#xff1a;元素(数据元素的映象) 指针(指示后继元素存储位置)&#xff0c;元素就是存储数据的存储单元&#xff0c;指…...

项目一 nfs 共享服务器 Haproxy 代理 Keepalive 高可用集群

深入理解程序的数据存储 配置NFS服务器 配置ansible环境...

TCP粘包解决方法

一. 产生原因及解决方法 产生原因&#xff1a;TCP是面向连接、基于字节流的协议&#xff0c;其无边界标记。当服务端处理速度比不其接收速度时&#xff0c;就很容易产生粘包现象。 解决方法&#xff1a;目前主要有两种解决方法&#xff0c;一个是在内容中添加分割标识&#xf…...

高职人工智能专业实训课之“生成对抗网络(GAN)”

一、前言 生成对抗网络&#xff08;GAN&#xff09;作为人工智能领域的一项重要技术&#xff0c;已经在图像生成、风格迁移、数据增强等多个领域展现出巨大的潜力和应用价值。为了满足高职院校对GAN专业实训课程的需求&#xff0c;唯众人工智能教学实训凭借其前沿的教育技术平…...

【MySQL系列】隐式转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

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

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

【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

树形结构C语言的实现

一.什么是树&#xff1a; 树形结构是一层次的嵌套结构。一个树形结构的外层和内层有相似的结构&#xff0c;所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构&#xff1a;一棵树可以简单的表示为根&#xff0c;左子树&#xff0c;右子树。左子树…...

小程序渗透测试的两种方法——burpsuite、yakit

首先呢主要是配置proxifier&#xff0c;找到小程序的流量&#xff0c;然后使用burpsuite或者yakit去抓包。 一、使用burpsuiteproxifier的抓包测试 1、先配置proxifier&#xff0c;开启http流量转发 勾选确定 2、配置burp对应代理端口&#xff0c;选择profile&#xff0c;点…...

代码随想录训练营Day56

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、搜索插入位置二、在排序数组中查找元素的第一个和最后一个位置 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 今天是跟着代码随想…...

S32K3 工具篇4:如何在S32DS中使用lauterbach下载

S32K3 工具篇4&#xff1a;如何在S32DS中使用lauterbach下载 1. TRACE32软件下载与配置2. 如何在S32DS里面构建劳德巴赫的接口2.1 新建工程带有lauterbach2.2 已有工程没有lauterbach 劳德巴赫lauterbach是一款非常经典强悍的调试器&#xff0c;还带有trace功能&#xff0c;在汽…...

深度神经网络语言识别

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 使用 DNN 和字符 n-gram 对一段文本的语言进行分类&#xff08;附 Python 代码&#xff09; 资料来源&#xff0c;flaticon&#xff1a;htt…...

STM32自己从零开始实操07:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感&#xff1a;通低频阻高频的。仿真中高频信号通过电感&#xff0c;因为电感会阻止电流发生变化&#xff0c;故说阻止高频信号 电容&#xff1a;隔直通交。…...

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于检验web前端基础水平。 开发环境&#xff1a;Visual Studio Code开发工具&#xff1a;HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…...

JAVA设计模式-监听者模式

什么是监听者模式 监听器模式是一种观察者模式的扩展&#xff0c;也被称为发布-订阅模式。在监听器模式中&#xff0c;存在两类角色&#xff1a;事件源&#xff08;Event Source&#xff09;和监听器&#xff08;Listener&#xff09;。事件源负责产生事件&#xff0c;而监听器…...

anaconda命令大全

目录 查看所有虚拟环境查看某虚拟环境安装的包创建虚拟环境激活创建好的虚拟环境回到之前的环境删除创建的虚拟环境查看conda所在的位置、虚拟环境位置等信息conda修改虚拟环境所在的位置 查看所有虚拟环境 conda env list查看某虚拟环境安装的包 激活要查看的虚拟环境之后&a…...

“论单元测试方法及应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目&#xff0c;简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如…...

解决Ubuntu18.04网络共享中的常见问题:从Permission denied到外网访问失败

Ubuntu 18.04网络共享全攻略&#xff1a;从静态IP配置到外网访问故障排查 当你需要在两台Ubuntu 18.04设备间共享网络连接时&#xff0c;可能会遇到各种意料之外的障碍。无论是权限问题、静态IP配置错误还是NAT转发失效&#xff0c;每个环节都可能成为网络共享路上的绊脚石。本…...

AI漫剧软件2025推荐,助力漫画创作高效产出

AI漫剧软件2025推荐&#xff0c;助力漫画创作高效产出在当今数字化时代&#xff0c;AI漫剧软件市场正蓬勃发展。据中国动漫协会《2025中国动漫产业发展报告》显示&#xff0c;2025年AI漫剧软件市场规模同比增长了45%&#xff0c;越来越多的创作者开始借助此类软件提升创作效率。…...

无人机组装调试仿真教学软件技术解析(架构+功能+落地)| 产品实测

在无人机职业教育领域&#xff0c;仿真教学软件的核心价值是“还原实操场景、降低落地成本、提升教学效率”&#xff0c;但目前多数同类软件普遍存在架构冗余、3D交互卡顿、功能与教学场景脱节、后台管理薄弱等痛点&#xff0c;难以满足院校规模化、标准化的组装调试教学需求。…...

AI辅助数据库设计:让快马平台智能分析ER图,推荐并生成优化后的SQL代码

最近在做一个员工管理系统的数据库设计&#xff0c;发现ER图的设计和SQL代码生成其实是个挺费脑子的活儿。好在现在有了AI辅助工具&#xff0c;整个过程变得轻松多了。今天就用一个实际案例&#xff0c;分享一下如何用智能工具优化数据库设计。 初始ER图分析 系统最初的设计很简…...

python-flask-djangol框架的减肥健身养生人士饮食营养管理系统

目录 技术选型与框架搭建核心功能模块设计数据模型设计示例&#xff08;Django ORM&#xff09;算法实现要点部署与扩展 项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 技术选型与框架搭建 Python Flask/Django框架均适合开发…...

ELK+Metricbeat搭建服务器监控看板:CPU/内存/磁盘全搞定

ELKMetricbeat实战&#xff1a;打造企业级服务器监控看板 当服务器集群规模超过50台时&#xff0c;凌晨三点被电话叫醒处理性能问题的运维人员&#xff0c;最需要的不是咖啡&#xff0c;而是一套能实时呈现CPU、内存、磁盘等关键指标的智能监控系统。本文将手把手带您用ELK Sta…...

别再傻傻分不清了!AUTOSAR里那三种接口到底怎么用?

AUTOSAR接口全解析&#xff1a;从快递员到内部电话的通信哲学 刚接触AUTOSAR的工程师们&#xff0c;面对琳琅满目的接口类型时&#xff0c;是否常有种"明明每个字都认识&#xff0c;连起来却看不懂"的困惑&#xff1f;就像第一次走进高级餐厅&#xff0c;面对三种看…...

Keil MDK进阶技巧:如何为单个C文件设置独立的优化等级(解决整体优化引发的诡异Bug)

Keil MDK进阶技巧&#xff1a;如何为单个C文件设置独立的优化等级&#xff08;解决整体优化引发的诡异Bug&#xff09; 当你在Keil MDK中为整个工程设置了高优化等级&#xff08;如-O2&#xff09;后&#xff0c;突然发现某个关键模块&#xff08;比如通信协议栈或算法库&…...

Win11系统下MongoDB的安装与配置全攻略

1. MongoDB简介与环境准备 MongoDB作为当前最流行的NoSQL数据库之一&#xff0c;以其灵活的文档存储结构和出色的扩展性深受开发者喜爱。在Win11系统上部署MongoDB&#xff0c;可以轻松搭建本地开发环境或小型生产环境。我最近在帮团队搭建测试环境时&#xff0c;发现很多新手…...

Nix系统修复终极指南:快速解决包管理问题与数据恢复

Nix系统修复终极指南&#xff1a;快速解决包管理问题与数据恢复 【免费下载链接】nix Nix, the purely functional package manager 项目地址: https://gitcode.com/gh_mirrors/ni/nix Nix作为一款纯粹函数式的包管理器&#xff0c;以其独特的依赖管理和环境隔离机制受到…...