java spi

什么javaspi

是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。也就是说java提供了一套API,然后由供应商进行扩展。jdbc的驱动就是这样实现的。

java spi 约定

  • 在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名

  • 使用ServiceLoader类动态加载META-INF中的实现类

  • 如SPI的实现类为Jar则需要放在主程序classPath中

  • Api具体实现类必须有一个不带参数的构造方法

案例 模仿jdbc驱动

架构方案

image.png

标准服务接口 :就相当于java提供的jdbc的接口工程
服务提供方 : 就相当于 oracle 和mysql 提供了自己的接口实现
调用方: 也就是我们项目中的dao层 使用jdbc的

标准服务接口

提供加载驱动的接口工程,新建一个jdbc-spi项目,用于制定接口规范,提供DriverManager接口


image.png

然后使用mvn install 命令进行把jdbc-spi项目生成jar包上传到maven的本地私服

服务提供方

oracle的服务提供

新建一个oracle项目,依赖jdbc-spi.jar并对其做实现


image.png

同时在resources资源目录下的META-INF.services目录下创建一个以接口全类名命名的文件,内容是实现类的全类名


image.png

mysql的服务提供

跟oracle的服务提供一样,需要对jdbc.spi工程中的接口进行实现,然后再resources文件夹下META-INF.services目录下创建一个以接口全类名命名的文件,内容是实现类的全类名
然后使用mvn install 命令进行把jdbc-spi项目生成jar包上传到maven的本地私服


image.png

调用方

需添加需要的提供方的jar包依赖


image.png

调用方代码的实现


image.png

目前的依赖使用的是mysql的驱动,执行结果为
image.png

当需要替换驱动的实现方式,由mysql替换成oracle,只需要替换服务提供方的jar就行了,调用方获取驱动的代码不需要修改


image.png

执行结果:
image.png

使用spi的好处

spi中标准接口服务只提供接口,没有提供实现类,接口实现类没有跟接口进行硬编码耦合在一起,所以扩展起来很方便。很好的进行了解耦功能。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容