笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

Java SPI笔记

Posted on 2024-06-12 10:05  草妖  阅读(3)  评论(0)    收藏  举报
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定义的所有服务提供者。这是一种非常灵活和可扩展的服务发现机制,适用于各种框架和库。