微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

开心一刻

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

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

  我:老师说了什么

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

  我:那你拿出来了吗

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

SPI

  概念

  SPI 全称 Service Provider Interface ,直译过来就是: 服务提供接口 ,是不是有点抽象?

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

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

  实现三板斧

  1、接口与实现

    Animal 接口

    Dog 实现

    Cat 实现

  2、配置文件

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

    2.1 在 src/main/resources/ 下建立目录: /meta-inf/services ,位置和名字都必须严格按这个来,一字都不能差

    2.2 在 /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 会进行如上的配置(后面问了老同事,没特别的原因,就是简单的认为只会有 xml 和 yml 配置文件

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

  然而楼主没用采用上述两种方案的任一一个,也没有改 pom.xml ,就问你气不气?

总结

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

  2、关于 SPI 的使用场景,楼主仍然不做概括(太菜,概括不好),大家自行去概括

  3、关于 pom.xml 

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

    但就是没讲 <build> ,下次补上,你们记得提醒我哦!

 

原文地址:https://www.cnblogs.com/youzhibing/p/16278516.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


前言 此种方式已过时,不再推荐,当下推荐方式:自我救赎 → 利用 IDEA 和 Spring Boot 搭建 SSM 本文旨在利用maven搭建ssm环境,而关于maven的具体内容,大家可以去阅读《Maven 实战》。其实园内这方面文章已有不少,那么为什么我还要重复造轮子呢?我只是想记录自己的实践
前言 项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单 maven的核心是 pom.xml,那么我们就来看看那些不同的地方 给我印象最深的就是如下四个元素:modules、parent、propert
开心一刻 今天去幼儿园接小侄女,路上聊起了天 小侄女:小叔,今天我吃东西被老师发现了 我:老师说了什么 小侄女:她说拿出来,跟小朋友一起分享 我:那你拿出来了吗 小侄女一脸可怜的看向我,说道:没有,我没有那么多鼻屎 SPI 概念 SPI 全称&#160;Service Provider Interf
本篇文章和大家了解一下怎么搭建maven私有仓库。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在本篇文章中,我们将介绍如何搭建一个Maven...
今天小编给大家分享的是如何解决Maven依赖冲突,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目...
这篇文章主要介绍了Maven仓库分类的优先级是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Maven仓库分类的优先级是什么文...
本篇内容主要讲解“Maven怎么实现自己的starter依赖”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Maven怎
本篇内容主要讲解“maven不能下载oraclejdbc驱动的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大...
这篇文章主要介绍了怎么使用maven基本命令打包包名的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用maven基本命令打包包...
本篇内容介绍了“maven中profile如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...