Java基础之SPI机制

news2024/11/28 22:32:04

Java基础之SPI机制

  • 一、SPI机制的简单示例
    • 1、案例分层
    • 2、接口
    • 3、实现类
    • 4、测试类
    • 5、结果
  • 二、SPI机制的缺陷


一、SPI机制的简单示例

1、案例分层

resources 接下来可以在resources下新建META-INF/services/目录,然后新建接口全限定名的文件:com.example.demo.service.Search,里面加上我们需要用到的实现类com.example.demo.service.impl.FileSearch
在这里插入图片描述

2、接口

public interface Search {
    public List<String> searchDoc(String keyword);
}

3、实现类

public class FileSearch implements Search {
    @Override
    public List<String> searchDoc(String keyword) {
        System.out.println("文件搜索 "+keyword);
        return null;
    }
}

4、测试类

@SpringBootTest
@Slf4j
public class SPITests {

    @Test
    void test1() {
        ServiceLoader<Search> s = ServiceLoader.load(Search.class);
        Iterator<Search> iterator = s.iterator();
        while (iterator.hasNext()) {
            Search search =  iterator.next();
            search.searchDoc("hello world");
        }
    }
}

5、结果

如果在com.example.demo.service.Search文件里写上两个实现类,那最后的输出结果就是两行了。这就是因为ServiceLoader.load(Search.class)在加载某接口时,会去META-INF/services下找接口的全限定名文件,再根据里面的内容加载相应的实现类。这就是spi的思想,接口的实现由provider实现,provider只用在提交的jar包里的META-INF/services下根据平台定义的接口新建文件,并添加进相应的实现类内容就好。

在这里插入图片描述

二、SPI机制的缺陷

  • 不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现。如果不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费。
  • 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类。
  • 多个并发多线程使用 ServiceLoader 类的实例是不安全的。

  • 世界上那些最容易的事情中,拖延时间最不费力。
  • 每个人都有属于自己的时刻表,别让任何人打乱你人生的节奏。
  • 那是九月的秋天你写的信,传至十月我游荡在黄金稻穗间的魂儿手中,牵着它引入了十一月的深秋,告诉我,你在冬日暖炉旁等候。
  • 成熟,是你出门总会自己带伞,很少再把自己淋湿;是你能控制自己的眼泪,很少再把自己感动哭。成熟是你学会善待自己,照顾好自己。你逐渐成为独立的个体,而不是将生活侥幸地寄托于外在的一切。没有人,一定会在雨夜去接你。没有人,一定会读懂你的心。
  • 只要心情是晴朗的,人生就没有雨天。生活不必太刻意,只要自己默默的努力,生活总会给你惊喜。
  • 圣诞老人是哪家快递的?活了十多年都没收到,差评。
  • 百日宣言,鸣惊天下。
  • 愿你如月光,明亮不清冷。
  • 有志者自有千计万计,无志者只感千难万难。
  • 年轻的态度与年轻的精神可以抹去心灵和面容上的皱纹,使眼睛充满光亮,使你看到未来。

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

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

相关文章

.net开发安卓入门 -记录两个问题处理办法

文章目录问题1、 Could not find 3 Android X assemblies, make sure to install the following NuGet packages解决办法1&#xff1a;解决办法2&#xff1a;问题2、Java.Lang.IllegalArgumentException: com.lhd. iml6yu: Targeting S (version 31 and above) requires that o…

计算机毕业设计 基于HTML+CSS+JavaScript响应式网站健身7页,适配手机端,响应式页面,页面精美,使用bootstrap 框架

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

PEMN~

搬来个来自美国东大的哦~~ 为了处理更复杂的任务&#xff0c;近年来神经网络的规模也在不断变大&#xff0c;如何高效的储存和传输神经网络变得十分重要。另一方面&#xff0c;随着彩票假说&#xff08;Lottery Ticket Hypothesis (LTH)&#xff09;的提出&#xff0c;随机稀疏…

基于java+springboot+mybatis+vue+mysql的私人健身与教练预约管理系统

项目介绍 21世纪&#xff0c;我国就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限的便利。像大部分机构都在开发自己的管理系统&#xff0c;由传统的管理模式向互联网发展&#xff0c;如今开发自己的系统是时代发展的必然产物。那么开发私人健身与教练预约管理系…

[附源码]Python计算机毕业设计电影票购票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.9 Saga 模式

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.9 Saga 模式38.9.1 Saga 模式38.9.2 四种模式对比38 动手实践 38.9 Saga 模式 38…

删除压缩包密码

压缩包设置了加密&#xff0c;需要输入压缩包密码才能够顺利解压文件出来。但是有些时候&#xff0c;一些文件只需要一段时间内要加密&#xff0c;之后文件不需要加密了&#xff0c;每次解压文件的时候还是需要输入压缩包密码才行&#xff0c;就很麻烦&#xff0c;那么RAR压缩包…

快速搭建 单体SpringCloudAlibaba 微服务

本章主要讲述快速构建一套springcloud alibaba微服务&#xff0c;一切从简 nacos官网 https://nacos.io/zh-cn/docs/quick-start.html 1.下载启动nacos注册中心 Git地址 https://github.com/alibaba/nacos/releases 1.1 nacos自带默认数据库 derby&#xff0c;集群情况下持久…

JVM(内存划分+类加载+GC)

目录 &#x1f432; 1. JVM 内存划分 &#x1f432; 2. JVM 类加载 &#x1f984; 2.1 类型加载是干啥的 &#x1f984; 2.2 类加载的简略流程 &#x1f984; 2.3 什么时候会进行类加载 &#x1f984; 2.4 双亲委派模型 &#x1f432; 3. GC 垃圾回收机制 &…

图像的OTSU阈值化、双阈值化、半阈值化的原理及OpenCV代码实现

本文的基础是OpenCV的函数threshold()&#xff0c;关于函数threshold()的详细介绍&#xff0c;大家可以参考下面这篇博文&#xff1a; https://www.hhai.cc/thread-162-1-1.html 一、图像的OTSU阈值化 在阈值化处理中&#xff0c;OTSU是一种常用的算法&#xff0c;中文译为大津…

JavaEE-多线程初阶2

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Thread类及常见方法获取当前线程引用休眠当前线程线程的状态线程的所有状态线程状态多线程的意义多线程带来的的风险-线程安全…

Python课程设计题目

文章目录1.基于Python的XX管理系统。2.基于Python的XX工具开发1.基于Python的XX管理系统。 实例要求&#xff1a;采用面向对象或是字典保存实例的属性信息。 功能要求&#xff1a;提供增加&#xff0c;删除&#xff0c;修改&#xff0c;单个查询&#xff0c;查询所有&#xff…

NFC标签 “ PN29_S

产品参数产品参数 产品型号 PN29_S 产品尺寸 (mm) 9546.45.4 显示技术 E ink 显示区域 (mm) 29(H)66.9(V) 分辨率 (像素) 296128 像素尺寸(mm) 0.2270.226 显示颜色 黑/白 视觉角度 180 工作温度 0℃ - 50℃ 电池 无需电池 工作频率 13.56 MHZ NF…

数据结构单循环链表

循环链表的特点是无须增加存储量&#xff0c;仅对表的链接方式稍作改变&#xff0c;即可使得表处理更加方便灵活。 【例】在链表上实现将两个线性表(a1&#xff0c;a2&#xff0c;…&#xff0c;an)和(b1&#xff0c;b2&#xff0c;…&#xff0c;bm)连接成一个线性表(a1&…

智云通CRM:那些令你无法控制的销售局面(一)

销售的复杂性并不仅仅是指购买者得人数很多。复杂销售的定义在最近的十年里有了突破性的变化和发展&#xff0c;这种变化和发展中出现了很多挑战&#xff0c;不仅业务员&#xff0c;就连业务经理都难以应对。因此&#xff0c;唯有制定简化处理程序的计划才能妥善应对这一局面。…

利用if语句求解成绩等级问题

1 问题 成绩进行划分等级&#xff0c;人工划分容易出错&#xff0c;且数量庞大。 2 方法 public class Text06 { public static void main(String[] args) { int score100; System.out.println("score"); // 1.成绩大于等于85 if (sc…

前端_Vue_4.类与样式绑定、条件渲染

文章目录一、Class与Style绑定1.1. 绑定HTML class1.1.1. 绑定对象1.1.2. 绑定数组1.1.3. 在组件上使用1.2. 绑定内联样式1.2.1. 绑定对象1.2.2. 绑定数组1.2.3. 自动前缀1.2.4. 样式多值二、条件渲染2.1. v-if2.2. v-else2.3. v-else-if2.4. \<template\> 上的 v-if2.5.…

电脑开不了机系统应该如何恢复正常

电脑不仅携带方便&#xff0c;而且功能也十分强大&#xff0c;不过电脑使用时会时不时出现问题&#xff0c;如果电脑开不了机怎么办 怎么回事?这是我们经常会遇到的这种的问题&#xff0c;今天小编就和大家分享电脑开不了机了的原因及解决方法。 工具/原料&#xff1a; 系统…

outlook中抄送操作和163撤回邮件

(1)CC和BCC 电子邮件中的CC 英文全称是 Carbon Copy(抄送)。 电子邮件中的BCC英文全称是 Blind Carbon Copy(暗抄送)。 两者的区别在于在BCC栏中的收件人可以看到所有的收件人名(TO&#xff0c;CC&#xff0c;BCC)&#xff0c;而在TO和CC栏中的收件人看不到BBC的收件人名。 …

Android 代码混淆Proguard

混淆概念 Android代码混淆&#xff0c;又称Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。 在Android的具体表现就是打包时&#xff0c;将项目里的包名、类名、变量名根据混淆规则进行更改&#xff0c…