Java SPI(Service Provider Interface)是一种服务发现机制,它通过在Classpath路径下的META-INF/services文件夹查找文件来动态地为接口找到服务提供者。
*\JavaSPIDemo\pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.namejr</groupId> <artifactId>JavaSPIDemo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/**</include> </includes> <filtering>false</filtering> </resource> </resources> <plugins> <plugin> <!-- 防止自动跳回1.5版本--> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
*\JavaSPIDemo\src\main\java\Main.java
import impl.SPIServiceDemo; import java.util.ServiceLoader; public class Main { public static void main(String[] args){ System.out.println("Hello World!!!"); ServiceLoader<SPIServiceDemo> loader = ServiceLoader.load(SPIServiceDemo.class); for (SPIServiceDemo service : loader) { service.runningDemo("The world doesn't need you to say hello."); } System.out.println("Bye World!!!"); } }
*\JavaSPIDemo\src\main\java\impl\SPIServiceDemo.java
package impl; public interface SPIServiceDemo { void runningDemo(String msg); }
*\JavaSPIDemo\src\main\java\impl\SPIFirstDemo.java
package impl; public class SPIFirstDemo implements SPIServiceDemo{ @Override public void runningDemo(String msg) { System.out.println("SPIFirstDemo Console:"+msg); } }
*\JavaSPIDemo\src\main\java\impl\SPITwoDemo.java
package impl; public class SPITwoDemo implements SPIServiceDemo{ @Override public void runningDemo(String msg) { System.out.println("SPITwoDemo Console:"+msg); } }
*\JavaSPIDemo\src\main\resources\META-INF\services\impl.SPIServiceDemo(注:1、impl.SPIServiceDemo文件是SPIServiceDemo接口的全限定类名;2、不需要添加任何后缀名称。),内容(为实现类(服务)的全限定类名)如下:
impl.SPIFirstDemo
impl.SPITwoDemo
运行输出:
Hello World!!! SPIFirstDemo Console:The world doesn't need you to say hello. SPITwoDemo Console:The world doesn't need you to say hello. Bye World!!! 已与地址为 ''127.0.0.1:15813',传输: '套接字'' 的目标虚拟机断开连接 进程已结束,退出代码为 0
作用:可以通过ServiceLoader和预定义得接口,自动发现并使用在META-INF/services/impl.SPIServiceDemo
定义的所有服务提供者。这是一种非常灵活和可扩展的服务发现机制,适用于各种框架和库。