java spi实现案例

简介

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

 

核心代码

spi接口定义

复制代码
public interface UserSpi {

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

 

spi实现提供者1

 <!-- 引入spi -->
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>spi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
public class UserSpiImpl1 implements UserSpi {
    @Override
    public User getUserById(Long id) {
        return new User(1L, "张三");
    }
}

 

 

 

spi实现提供者2

 <!-- 引入spi -->
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>spi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
public class UserSpiImpl2 implements UserSpi {
    @Override
    public User getUserById(Long id) {
        return new User(2L, "李四");
    }
}

 

 

 

使用者测试

复制代码
<!-- spi定义模块 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>spi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- spi实现模块1 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>spi-impl1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- spi实现模块2 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>spi-impl2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
复制代码

 

复制代码
public class Test {

    public static void main(String[] args) {
        ServiceLoader<UserSpi> s = ServiceLoader.load(UserSpi.class);
        Iterator<UserSpi> 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

posted @   追极  阅读(196)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示