SPI机制漫谈

前言

还是最近数据库改密的问题,我司最开始是引入第三方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 源码 先挖个坑 等我回来补

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值