文章目录

    • @[toc]
  • 使用入门
  • SPI机制原理

https://blog.csdn.net/qq_20397315/article/details/106095184

SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。


使用入门

创建接口和其实现类

public interface DbInterface {void say();
}
public class Db1 implements DbInterface {@Overridepublic void say() {System.out.println("DB1");}
}
public class Db2 implements DbInterface {@Overridepublic void say() {System.out.println("DB2");}
}

resource目录下创建META-INF/services目录,并在改目录下创建一个名为接口全限定名的文件

我这里是com.zy.spi.DbInterface

com.zy.spi.DbInterface文件中填写接口实现类的全限定名;

com.zy.spi.Db1
com.zy.spi.Db2

使用

    @Testpublic void t1() {//java.util.ServiceLoaderServiceLoader<DbInterface> load = ServiceLoader.load(DbInterface.class);load.forEach(DbInterface::say);/*for (DbInterface dbInterface : load) {dbInterface.say();}*/}

可以看到,java.util.ServiceLoader类位于java.util包下,却加载到了我们自己定义的Db1和DB21类


SPI机制原理

https://blog.csdn.net/qq_20397315/article/details/106095184

ServiceLoader.load方法

    public static <S> ServiceLoader<S> load(Class<S> service) {ClassLoader cl = Thread.currentThread().getContextClassLoader();return ServiceLoader.load(service, cl);}

可以看到使用的是线程上下文类加载器来打破双亲委派模型;

线程上下文类加载器详解

ServiceLoader实现了Iterable,只有在我们迭代ServiceLoader对象时,才会去加载META-INF/services目录下文件中的记录的类(懒加载);

最终调用的方法是hasNextService()

        private boolean hasNextService() {if (nextName != null) {return true;}if (configs == null) {try {//PREFIX : private static final String PREFIX = "META-INF/services/";//service.getName() 即接口的全限定名String fullName = PREFIX + service.getName();if (loader == null)configs = ClassLoader.getSystemResources(fullName);elseconfigs = loader.getResources(fullName);} catch (IOException x) {fail(service, "Error locating configuration files", x);}}while ((pending == null) || !pending.hasNext()) {if (!configs.hasMoreElements()) {return false;}pending = parse(service, configs.nextElement());}nextName = pending.next();return true;}

MySQL驱动使用了SPI机制,因此在jdbc4及以后,可以不用显示的加载数据库驱动类;


SPI机制入门、SPI机制原理相关推荐

  1. Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制

    前言 我们在往期文章中,曾经深入分析过Java的SPI机制,它是一种服务发现机制.具体详见:深入理解JDK的SPI机制 在继续深入Dubbo之前,我们必须先要明白Dubbo中的SPI机制.因为有位大神 ...

  2. JAVA SPI机制及SPI机制在Tomcat中的应用

    SPI 是 JAVA 提供的一种服务提供发现接口,其实就是一种面向接口的编程,为接口去匹配具体服务实现的机制,这一点上与 IOC 的思想类似,都是把装配的控制权放到了程序之外,下面具体看看什么是 SP ...

  3. 【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 注意:dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外 文章目 ...

  4. Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...

  5. java的两种运行机制_Java☞JVM工作原理

    参考博客:1 2 3 JVM工作原理 java虚拟机体系结构 Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平 ...

  6. handler消息机制入门

    handler消息机制入门 为什么要用handle? 我们在网络上读取图片信息时,是不能把耗时操作放在主线程里面的,当我们在子线程中获取到了图片的消息的时候,我们就需要把这个数据传给主线程. 而直接使 ...

  7. 垃圾回收机制的优点和原理

    垃圾回收机制的优点和原理:Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理. 由于有个垃圾回 ...

  8. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  9. Kafka中副本机制的设计和原理

    Kafka中一个分区可以拥有多个副本,副本可分布于多台机器上.而在多个副本中,只会有一个Leader副本与客户端交互,也就是读写数据.其他则作为Follower副本,负责同步Leader的数据,当Le ...

  10. mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了

    前面我们基于实际案例搭建了缓存高可用方案(分布式缓存高可用方案,我们都是这么干的)同时提到了redis主从架构下是如何保证高可用的,讲到了它是通过redis sentinel的机制来实现的. 今天我们 ...

最新文章

  1. python 下载文件 限速-Python网络爬虫---scrapy通用爬虫及反爬技巧
  2. 三级栏目选项卡 html,李长河 中文主页 实验题目三级页面(隐藏栏目,用于放置对应三级页面) 中国地质大学(武汉)教师个人主页系统...
  3. 数据结构与算法--图论最短路径算法应用-词阶求解
  4. Docker 精通之入门
  5. 腾讯视频客户端如何设置快进速度
  6. 【转】Eclipse+CDT+Gcc编译选项控制
  7. Squeeze Net
  8. [原创]按键小精灵通用去广告破解补丁
  9. (转载)操作系统还有未来么?
  10. C# 使用 Windows 消息队列机制
  11. 将长整型IP地址转换成点分十进制
  12. figure元素和figcaption元素
  13. 跟我20天学Java:01-计算机基础以及JDK、IDEA等安装详解
  14. 影视后期制作中AEnbsp;抠像技术浅…
  15. 安利一个程序员学习法
  16. avg制作工具 开源_23种开源视听制作工具
  17. 使用MPLAB X 对PIC单片机进行配置
  18. 手机能运行linux系统吗,老外继续折腾iPhone 7,成功运行Linux
  19. 站长必备的131个高权重外链库(转…
  20. 改进版爬虫 爬取漂亮妹纸图1

热门文章

  1. java log4j 多线程_针对log4j 1.2.15中的并发锁问题,到底是io瓶颈,还是锁竞争导致线程block?...
  2. java map存储格式_java HashMap HashSet的存储方式
  3. Swift 5 UIStackView中添加自动换行的Label
  4. 【证明】两个自变量的二阶线性方程经过可逆变换后方程的类型不会改变
  5. tl-wdr5620千兆版设置虚拟服务器,TL-WDR5620路由器如何设置 TL-WDR5620路由器上网设置步骤【介绍】...
  6. uva 1587 题解
  7. 蒙特卡罗树搜索+深度学习 -- AlphaGo原版论文阅读笔记
  8. 树上启发式合并算法概述及习题
  9. 2020牛客多校训练1 I 1or2(拆点拆边带花树一般图最大匹配)
  10. BIO/NIO/AIO的区别及应用场景