前言
还是最近数据库改密的问题,我司最开始是引入第三方jar包来进行数据加密的 手动引入jdbc驱动的时候让我想起来了之前面试问的我SPI机制(该死 一个外包公司 为什么问我SPI 还问这么底层)
SPI 简单介绍
首先SPI是什么 我个人认为他是和API 一套相反设计思想。调用方无权对API的接口规范干预,SPI也是遵循用户定义好的规范实现接口。
设计思想
1 使用约定的配置文件 以Java SPI 举例 在META-INF/service 目录
2.服务提供方提供对应的配置
3使用ClassLoader 的getResources 来读取classpath的文件
SPI 示例
其实SPI机制没有网上说的那么神秘,我们每天都在使用SPI机制 SPI的教程中都是从jdbc的驱动连接讲起的
举个例子
平时我们使用 接口都是通过new 一个实现类来实现
A a=new B();
如果new B() 交给我们来管理会导致两个问题 我们需要知道B的全限定名
现在有SPI 来帮助我们完成 读取全限定名
public static void main(String[] args) {
ServiceLoader<postResume> loader=ServiceLoader.load(postResume.class);
for (postResume postResume : loader) {
postResume.post("高萌");
}
Map map=new HashMap<>();
}
遍历就可以调用出对应的方法啦。
SPI 原理探究
通过 ServiceLoader 读取全限定名进行加载 原理大概就是 反射拿到当前类和类加载去创建一个ServiceLoader 真正加载的代码在next中的newLookupIterator中
lookupIterator1 负责从配置文件中读取
值得一提的是META-INF/service 是传统类路径环境中的服务发现机制所以会使用LazyClassPathLookupIterator 进行加载
SPI 拓展
SPI 与 AutoConfig 关系 最近在读Spring 源码 先挖个坑 等我回来补