SPI机制入门、SPI机制原理
文章目录
- @[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机制原理相关推荐
- Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制
前言 我们在往期文章中,曾经深入分析过Java的SPI机制,它是一种服务发现机制.具体详见:深入理解JDK的SPI机制 在继续深入Dubbo之前,我们必须先要明白Dubbo中的SPI机制.因为有位大神 ...
- JAVA SPI机制及SPI机制在Tomcat中的应用
SPI 是 JAVA 提供的一种服务提供发现接口,其实就是一种面向接口的编程,为接口去匹配具体服务实现的机制,这一点上与 IOC 的思想类似,都是把装配的控制权放到了程序之外,下面具体看看什么是 SP ...
- 【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解
本文对应源码地址:https://github.com/nieandsun/dubbo-study 注意:dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外 文章目 ...
- Java并发机制的底层实现原理
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...
- java的两种运行机制_Java☞JVM工作原理
参考博客:1 2 3 JVM工作原理 java虚拟机体系结构 Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平 ...
- handler消息机制入门
handler消息机制入门 为什么要用handle? 我们在网络上读取图片信息时,是不能把耗时操作放在主线程里面的,当我们在子线程中获取到了图片的消息的时候,我们就需要把这个数据传给主线程. 而直接使 ...
- 垃圾回收机制的优点和原理
垃圾回收机制的优点和原理:Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理. 由于有个垃圾回 ...
- 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理
第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...
- Kafka中副本机制的设计和原理
Kafka中一个分区可以拥有多个副本,副本可分布于多台机器上.而在多个副本中,只会有一个Leader副本与客户端交互,也就是读写数据.其他则作为Follower副本,负责同步Leader的数据,当Le ...
- mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
前面我们基于实际案例搭建了缓存高可用方案(分布式缓存高可用方案,我们都是这么干的)同时提到了redis主从架构下是如何保证高可用的,讲到了它是通过redis sentinel的机制来实现的. 今天我们 ...
最新文章
- python 下载文件 限速-Python网络爬虫---scrapy通用爬虫及反爬技巧
- 三级栏目选项卡 html,李长河 中文主页 实验题目三级页面(隐藏栏目,用于放置对应三级页面) 中国地质大学(武汉)教师个人主页系统...
- 数据结构与算法--图论最短路径算法应用-词阶求解
- Docker 精通之入门
- 腾讯视频客户端如何设置快进速度
- 【转】Eclipse+CDT+Gcc编译选项控制
- Squeeze Net
- [原创]按键小精灵通用去广告破解补丁
- (转载)操作系统还有未来么?
- C# 使用 Windows 消息队列机制
- 将长整型IP地址转换成点分十进制
- figure元素和figcaption元素
- 跟我20天学Java:01-计算机基础以及JDK、IDEA等安装详解
- 影视后期制作中AEnbsp;抠像技术浅…
- 安利一个程序员学习法
- avg制作工具 开源_23种开源视听制作工具
- 使用MPLAB X 对PIC单片机进行配置
- 手机能运行linux系统吗,老外继续折腾iPhone 7,成功运行Linux
- 站长必备的131个高权重外链库(转…
- 改进版爬虫 爬取漂亮妹纸图1
热门文章
- java log4j 多线程_针对log4j 1.2.15中的并发锁问题,到底是io瓶颈,还是锁竞争导致线程block?...
- java map存储格式_java HashMap HashSet的存储方式
- Swift 5 UIStackView中添加自动换行的Label
- 【证明】两个自变量的二阶线性方程经过可逆变换后方程的类型不会改变
- tl-wdr5620千兆版设置虚拟服务器,TL-WDR5620路由器如何设置 TL-WDR5620路由器上网设置步骤【介绍】...
- uva 1587 题解
- 蒙特卡罗树搜索+深度学习 -- AlphaGo原版论文阅读笔记
- 树上启发式合并算法概述及习题
- 2020牛客多校训练1 I 1or2(拆点拆边带花树一般图最大匹配)
- BIO/NIO/AIO的区别及应用场景