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