怎么进行Java SPI机制的分析

发布时间:2021-12-10 13:08:31 作者:柒染
来源:亿速云 阅读:128

这篇文章将为大家详细讲解有关怎么进行Java SPI机制的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

为什么需要SPI?

思考一个场景,我们封装了一套服务,别人通过引入我们写好的包,就可以使用这些接口API,完成相应的操作,这本来没有什么问题,但是会存在使用该服务的实体有不相同的业务需求,需要进一步的扩展,但是由于api是写好的,想要扩展并非那么的简单,如果存在这样子的场景,我们该怎么办?

可以使用Java 提供的SPI机制

什么是SPI?SPI和API的区别

SPI

SPI的全称是Service Provider Interface,是Java提供的可用于第三方实现和扩展的机制,通过该机制,我们可以实现解耦,SPI接口方负责定义和提供默认实现,SPI调用方可以按需扩展

API的全称是Application Programming Interface,广义上来看就是接口,负责程序与程序之间进行协作的通道,就好比上面给的例子,【我们封装好了一套服务,通过API的形式提供给他人使用,别人使用API就能得到想要的】

所以他们俩的区别就很明显了,API的调用方只能依赖使用提供方的实现,SPI就如同可定制化的API一样,调用方可以自定义实现替换API提供的默认实现

来人,上点对抗

首先,我们新建一个空的maven项目,里边有两个包

spi-provider从名字就可以得知是SPI的提供方

spi-user SPI的使用方

怎么进行Java SPI机制的分析

spi-provider

我们简单定义一个SPI接口,就叫ISpiTest,里边就一个saySomething方法,再提供一个默认的实现

public interface ISpiTest {
	void saySomething();
}

public class DefaultSpiImplementation implements ISpiTest{
	@Override
	public void saySomething() {
		System.out.println("[默认实现] -> 今天也是充满希望的一天");
	}
}

然后,模拟走流程,注意步骤4是我们之后要自定义替换的

/**
 * 模拟一套流程
 * @author Amg
 * @date 2021/12/9
 */
public class TestUtils {
	
	public static void workFlow(ISpiTest s) {
		
		System.out.println("1、步骤1.......");
		System.out.println("2、步骤2.......");
		System.out.println("3、步骤3.......");
		System.out.print("4、步骤4:");
		s.saySomething();
		System.out.println("5、步骤5.......");
	}
}

接着,重点来了,我们需要在resources目录下面创建/META-INF/services文件夹,然后以SPI接口的全限定类名作为名称创建一个文件

怎么进行Java SPI机制的分析

往文件里面填写实现类的全限定类名,如下

com.amg.spi.DefaultSpiImplementation

到此,spi-provider这个模块就完成了,至于之后要怎么使用,到spi-user模块中进一步说明

spi-user

首先,我们在pom文件中,引入spi-provider坐标依赖

怎么进行Java SPI机制的分析

然后定义main方法,在main方法中调用在spi-provider中定义的SPI接口,此时采用的是默认的配置

怎么进行Java SPI机制的分析

可以注意到我们使用ServiceLoader这个类的load方法,传入SPI接口的字节码进行构造,我们在spi-provider中resources中给出了一个默认实现,但是我们是在spi-user中去调用的,ServiceLoader会自动读取META-INF下的配置文件,就算是跨jar包也是可以的

然后现在我们在spi-user中定义一个实现类,以及把他配置到META-INF下(需要注意,这个配置的全限定类名仍然需要是spi-provider中定义SPI接口的路径),来看看效果

怎么进行Java SPI机制的分析

spi-user下META-INF里边内容如下

com.amg.spiuser.service.impl.WantHamburger

怎么进行Java SPI机制的分析

可以发现,我们并没有改变任何的客户端代码,只是把配置文件进行了简单的修改,即可完成自定义实现,这就是使用SPI的魅力

????思考一下,我们之前的流程是怎么做的

首先定义了一个接口,面向接口编程嘛定义配置文件各个自定义的实现类,只需要按照规则重写配置文件即可

SPI是策略模式的一种体现,配合面向接口编程的思想以及必要的配置文件,即可完成定义和具体实现的解耦,而且是可定制化的API

SPI的优点有以下

定制化实现接口解耦

SPI的缺点有以下

通过观察ServiceLoader,可以发现并没有额外的加锁机制,所以会存在并发问题获取对应的实现类不够灵活,从上面例子可以看出,需要使用迭代器的方式获取需要知道接口的所有具体实现类,所以每次都要加载和实例化所有的实现类。

关于怎么进行Java SPI机制的分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. Java SPI机制原理是什么?
  2. Java中SPI 机制的原理是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java spi

上一篇:怎么进行Spring Boot 分层打包Docker 镜像实践及分析

下一篇:Javascript基础中的十个重要问题分别是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》