Fundamentals 11 min read

1. Introduction to SPI

This article introduces Java's Service Provider Interface (SPI) mechanism, explaining its role in decoupling interface definitions from implementations, with examples in JDBC, Spring Boot, and Dubbo.

JD Tech Talk
JD Tech Talk
JD Tech Talk
1. Introduction to SPI

1.SPI简介

SPI(Service Provicer Interface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规范以及可以发现接口实现的机制,而不需要实现接口。

SPI机制在Java中应用广泛。例如:JDBC中的数据库连接驱动使用SPI机制,只定义了数据库连接接口的规范,而具体实现由各大数据库厂商实现,不同数据库的实现不同,我们常用的mysql的驱动也实现了其接口规范,通过这种方式,JDBC数据库连接可以适配不同的数据库。

SPI机制在各种框架中也有应用,例如:springboot的自动装配中查找spring.factories文件的步骤就是应用了SPI机制;dubbo也对Java的SPI机制进行扩展,实现了自己的SPI机制。

2.SPI入门案例

2.1.创建工程

我们刚才在介绍中说过了,SPI机制需要定义接口规范,这里我们以一个简单的接口案例来说明。

首先我们需要创建四个工程:

spi-interface,这里定义SPI的接口类:Person

spi-impl1,这里定义接口的第一个实现类:Teacher

spi-impl2,这里定义接口的第二个实现类:Student

spi-test,这里通过S...e="font-size: 16px"> 这个方法会执行

String fullName = PREFIX + service.getName()

,而PREFIX就是我们前面刚才说的非常重要的属性,其值为

META-INF/services/

service

就是接口类,其最终的fullName指的就是

META-INF/services

文件夹下的名称为

com.jd.spi.Person

的文件。

接着会执行 configs = loader.getResources(fullName) 方法,这个方法这里不做详细描述,其主要功能就是获取类路径下所有相对路径为fullName的所有文件的URL对象。

然后会执行 pending = parse(service, configs.nextElement()) 方法,这个方法这里也不详细描述,其主要功能是读取文件,将文件内容变成字符串,然后 nextName 就被赋值为当前文件的内容,即 实现类的接口全限定名 。

因此,执行 hasNextService() 方法后,nextName被赋值为一个实现类的全限定名。

我们继续看上面的 nextService() 方法,其最终会执行 c = Class.forName(cn, false, loader) 方法,这个方法很明显就是通过反射实例化一个对象。通过一系列操作,最终返回了对应实现类的对象。

3.3.流程总结

我们将其总结为以下几个步骤:

1. 创建ServiceLoader对象

2. 创建迭代器lookupIterator

3. 通过迭代器的hasNextService方法读取类路径下 META-INF/services 目录的所有名称为接口全限定名的文件,将其内容存入configs对象中

4. 从configs对象中获取实现类的全限定名,然后通过反射实例化对象

从上述流程,我们也可以总结实现SPI的几点重要信息:

1. 实现工程必须在类路径下的 META-INF/services 目录下创建接口全限定名的文件,其文件内容必须是接口实现类的全限定名

2. 实现类必须有一个无参构造方法,因为SPI默认是使用无参构造方法实例化对象的

4.总结

本文首先概述了Java的SPI机制,随后阐述了其基本使用方法,最后深入探讨了其实现原理。SPI在Java语言体系中具有广泛应用,能够有效地实现系统解耦,众多框架基于此机制进行了拓展和优化,从而实现了更为强大的SPI机制。掌握SPI的使用技巧可以帮助我们设计出更为灵活的系统,而深入理解其原理则有助于提升我们的技术水平。

扫一扫,加入技术交流群

Spring BootJDBCJava FundamentalsJava SPIService Provider Interface
JD Tech Talk
Written by

JD Tech Talk

Official JD Tech public account delivering best practices and technology innovation.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.