Java程序员在日常工作中经常听到SPI,很多框架都使用了SPI技术,那么问题来了,什么是SPI?今天阿粉就带大家详细了解一下SPI。SPI概念SPI的全称是ServiceProviderInterface。它是一种动态加载和实现JDK内置扩展点的机制。通过SPI技术,我们无需自己创建即可动态获取接口的实现类。接口和实现类说到这里,那么SPI技术的技术细节有哪些呢?接口:需要有功能接口;实现类:接口只是一个规范,具体的实现需要一个实现类,所以实现类是必不可少的;配置文件:实现SPI机制,必须有一个与接口同名的文件存放在类路径下的META-INF/services文件夹中,文件中每一行的内容都是完整的实现类的路径;类加载器ServiceLoader:JDK内置的类加载器,用于加载配置文件中的实现类;举个栗子说说SPI的几个概念,接下来阿粉会通过一个栗子给大家展示具体的用法。第一步是创建一个接口,这里我们创建一个解压接口,里面定义了压缩和解压两种方法。packagecom.example.demo.spi;publicinterfaceCompresser{byte[]compress(byte[]bytes);byte[]decompress(byte[]bytes);}第二步再写两个对应的实际类,分别是GzipCompresser.java和WinRarCompresser.java代码如下packagecom.example.demo.spi.impl;importcom.example.demo.spi.Compresser;导入java.nio.charset.StandardCharsets;公共类GzipCompresser实现Compresser{@Overridepublicbyte[]compress(byte[]bytes){return"compressbyGzip".getBytes(StandardCharsets.UTF_8);}@Overridepublicbyte[]decompress(byte[]bytes){return"decompressbyGzip".getBytes(StandardCharsets.UTF_8);}}packagecom.example.demo.spi.impl;importcom.example.demo.spi.Compresser;importjava.nio.charset.StandardCharsets;publicclassWinRarCompresserimplementsCompresser{@Overridepublicbyte[]compress(byte[]bytes){return"由WinRar压缩".getBytes(StandardCharsets.UTF_8);}@Overridepublicbyte[]decompress(byte[]bytes){返回“WinR解压缩ar".getBytes(StandardCharsets.UTF_8);}}第三步创建配置文件,我们接着在resources目录下创建一个名为META-INF/services的文件夹,并创建一个名为com.example.demo.spi的文件夹.Compresser文件,内容如下:com.example.demo.spi.impl.WinRarCompressercom.example.demo.spi.impl.GzipCompresser注意文件名必须是接口的全路径,并且文件中的内容每一行是一个实现类的全路径,多个实现类分多行写,效果如下第四步有了上面的接口,实现类和配置文件,接下来我们就可以使用了ServiceLoader动态加载实现SPI技术的实现类,如下:packagecom.example.demo;importcom.example.demo.spi.Compresser;importjava.nio.charset.StandardCharsets;importjava.util.ServiceLoader;publicclassTestSPI{publicstaticvoidmain(String[]args){ServiceLoader
