java SPI机制学习笔记

1.机制简介

SPI的全名为Service Provider Interface.是JDK内置的一种服务发现机制,在java.util.ServiceLoader的文档里有比较详细的介绍。
简单的总结下javaspi机制的思想:
是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔。

2.SPI具体约定

java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk提供服务实现查找的一个工具类:java.util.ServiceLoader

3.应用场景

举一个很常见的例子:
jdbc 开发人员还需要基于Class.forName(“xxx”)的方式来装载驱动,jdbc4也基于spi的机制来发现驱动提供商了,可以通过META-INF/services/java.sql.Driver文件里指定实现类的方式来暴露驱动提供者

4.案例说明

本文用的是springboot框架做的测试,springboot在打成jar包的时候可能会出现BOOT-INF文件夹,需要在pom文件中做如下配置:
在这里插入图片描述
本文使用了两个项目做测试,一个作为服务引用的项目(本文的项目名称为demo4),一个是服务提供的项目的(本文的项目名称为demo5,会打成jar包)

demo5项目做如下操作:
①接口定义如下:
在这里插入图片描述
②实现类定义如下:
这次使用两个实现类为了测试能否发现一个接口的多个实现!
在这里插入图片描述
在这里插入图片描述
③准备services文件夹,之后放入提供服务的jar包的META-INF文件夹下:
在这里插入图片描述
这里第二个文件请忽略,文件名为接口的全路径名,内容如下:
在这里插入图片描述
④准备好之后,把提供服务的项目打成jar包,并把上面准备好的services文件夹放入jar包中,在demo4项目中引用demo5项目的jar包
在这里插入图片描述

5.写验证程序,代码如下:

在这里插入图片描述
结果为两个服务都被ServiceLoader.load()方法根据接口找到了,并成功执行了对应实现类中的方法。
本文的服务提供的jar包:demo5-0.0.1-SNAPSHOT.jar

猜你喜欢

转载自blog.csdn.net/qq_27466827/article/details/82999260
今日推荐