java spi实现案例


简介

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来扩展和替换组件,主要是被框架的开发人员使用。

核心代码

spi接口定义

public interface UserSpi {

    /**
     * 获取用户信息
     *
     * @param id 用户ID
     * @return 用户信息
     */
    User getUserById(Long id);
}

spi实现提供者1

 
    <dependencies>
        <dependency>
            <groupId>org.examplegroupId>
            <artifactId>spiartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>
public class UserSpiImpl1 implements UserSpi {
    @Override
    public User getUserById(Long id) {
        return new User(1L, "张三");
    }
}

spi实现提供者2

 
    <dependencies>
        <dependency>
            <groupId>org.examplegroupId>
            <artifactId>spiartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>
public class UserSpiImpl2 implements UserSpi {
    @Override
    public User getUserById(Long id) {
        return new User(2L, "李四");
    }
}

使用者测试


        <dependency>
            <groupId>org.examplegroupId>
            <artifactId>spiartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        <dependency>
            <groupId>org.examplegroupId>
            <artifactId>spi-impl1artifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        <dependency>
            <groupId>org.examplegroupId>
            <artifactId>spi-impl2artifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
public class Test {

    public static void main(String[] args) {
        ServiceLoader s = ServiceLoader.load(UserSpi.class);
        Iterator iterator = s.iterator();
        while (iterator.hasNext()) {
            //如果存在多个实现类,则会遍历调用
            UserSpi userSpi = iterator.next();
            User user = userSpi.getUserById(1L);
            System.out.println(user);
        }

    }
}

源码

github: https://github.com/hdwang123/spitest

参考文章

https://blog.csdn.net/weixin_45987961/article/details/121052452

https://blog.csdn.net/qq_35958391/article/details/123406879

https://blog.csdn.net/jjclove/article/details/124379195