开心一刻
今天去幼儿园接小侄女,路上聊起了天
小侄女:小叔,今天我吃东西被老师发现了
我:老师说了什么
小侄女:她说拿出来,跟小朋友一起分享
我:那你拿出来了吗
小侄女一脸可怜的看向我,说道:没有,我没有那么多鼻屎
SPI
概念
Service Provider Interface ,直译过来就是: 服务提供接口
简单点理解,Java SPI 就是提供这样的一个机制:为某个接口寻找服务实现的机制
还是抽象?我们往下看它的具体实现就好理解了
实现三板斧
1、接口与实现
Animal 接口
Dog 实现
Cat 实现
2、配置文件
配置文件有点讲究,需要按这套规则来
src/main/resources/ 下建立目录: /META-INF/services
/META-INF/services 目录下创建一个以接口全限定类名为名的文件: com.qsl.service.Animal
2.3 将接口实现类的全限定类名写入到 2.2 创建的文件中,一个实现占一行
3、ServiceLoader 加载
ServiceLoader
正常情况下会输出如下内容
示例工程结构如下
SPI
Java SPI 是 基于接口的编程 + 策略模式 + 配置文件
使用场景
不太好概括,一千个人眼中有一千个哈姆雷特
但是我们可以通过一些案例来形成自己的概括
1、DriverManager
JDBC
DriverManager
MySQL
2、SLF4J
具体源码我就不带大家去跟了,有兴趣的可以去看看:从源码来理解slf4j的绑定,以及logback对配置文件的加载 中的问题1
3、Spring SPI
Spring 有自己的 SPI 实现机制,和 JDK SPI
Spring 是在 src/main/resources/META-INF 目录下创建 spring.factories
4、Dubbo SPI
Dubbo 又有自己的一套实现,配置文件需要放到 META-INF/dubbo
具体细节可查看其官方文档:Dubbo SPI
问题重现
JDK SPI
但正是这么简单的东西,楼主都碰到了问题,如下图所示
当时人就懵了!!!
问题排查
JDK SPI
demo 来验证 实现三板斧
demo 的执行是没问题的,这也就说明 JDK SPI
Spring SPI
spring.factories
maven 构建出了问题,所以我对项目进行了 package
META-INF 目录下的 com.qsl.service.Animal
pom.xml
pom.xml
此刻,相信大家都知道怎么改了吧(去掉<includes>标签,或者在<includes>中加上)
pom.xml
总结
JDK SPI 的使用,就那三板斧,如果出了问题,不用想,肯定不是 JDK SPI
SPI
pom.xml
楼主之前写过一篇:Maven pom.xml中的元素modules、parent、properties以及import
<build>