开心一刻

  今天去幼儿园接小侄女,路上聊起了天

  小侄女:小叔,今天我吃东西被老师发现了

  我:老师说了什么

  小侄女:她说拿出来,跟小朋友一起分享

  我:那你拿出来了吗

  小侄女一脸可怜的看向我,说道:没有,我没有那么多鼻屎

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_spring

SPI

  概念

Service Provider Interface ,直译过来就是: 服务提供接口

  简单点理解,Java SPI 就是提供这样的一个机制:为某个接口寻找服务实现的机制

  还是抽象?我们往下看它的具体实现就好理解了

  实现三板斧

  1、接口与实现

    Animal 接口

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_xml_02

    Dog 实现

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_配置文件_03

    Cat 实现

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_SPI_04

  2、配置文件

    配置文件有点讲究,需要按这套规则来

src/main/resources/ 下建立目录: /META-INF/services

/META-INF/services 目录下创建一个以接口全限定类名为名的文件: com.qsl.service.Animal

    2.3 将接口实现类的全限定类名写入到 2.2 创建的文件中,一个实现占一行

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_spring_05

  3、ServiceLoader 加载

ServiceLoader

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_SPI_06

    正常情况下会输出如下内容

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_配置文件_07

  示例工程结构如下

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_spring_08

SPI

Java SPI 是 基于接口的编程 + 策略模式 + 配置文件

  使用场景

  不太好概括,一千个人眼中有一千个哈姆雷特

  但是我们可以通过一些案例来形成自己的概括

  1、DriverManager

JDBC

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_xml_09

DriverManager

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_SPI_10

MySQL

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_SPI_11

  2、SLF4J

    具体源码我就不带大家去跟了,有兴趣的可以去看看:​​从源码来理解slf4j的绑定,以及logback对配置文件的加载​​ 中的问题1

  3、Spring SPI

Spring 有自己的 SPI 实现机制,和 JDK SPI

Spring 是在 src/main/resources/META-INF 目录下创建 spring.factories

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_配置文件_12

  4、Dubbo SPI

Dubbo 又有自己的一套实现,配置文件需要放到 META-INF/dubbo

    具体细节可查看其官方文档:​​Dubbo SPI​

问题重现

JDK SPI

  但正是这么简单的东西,楼主都碰到了问题,如下图所示

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_配置文件_13

  当时人就懵了!!!

问题排查

JDK SPI

demo 来验证 实现三板斧

demo 的执行是没问题的,这也就说明 JDK SPI

Spring SPI

spring.factories

maven 构建出了问题,所以我对项目进行了 package

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_spring_14

META-INF 目录下的 com.qsl.service.Animal

pom.xml

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_SPI_15

pom.xml

  此刻,相信大家都知道怎么改了吧(去掉<includes>标签,或者在<includes>中加上)

pom.xml

总结

JDK SPI 的使用,就那三板斧,如果出了问题,不用想,肯定不是 JDK SPI

SPI

pom.xml

    楼主之前写过一篇:​​Maven pom.xml中的元素modules、parent、properties以及import​​

<build>

记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧_SPI_16