• Java SPI机制


    是一种思想
    以下解释来自于chat-gpt

    在Java中,SPI(Service Provider Interface)是一种机制,用于在运行时发现和加载具体的实现类或服务提供者。SPI 通常与Java的java.util.ServiceLoader类一起使用,它提供了在类路径上查找和加载服务提供者的简单方法。

    以下是使用Java SPI的一般步骤:

    1. 定义服务接口: 定义一个接口,表示你想要提供的服务。

      // MyService.java
      public interface MyService {
          void doSomething();
      }
      
      • 1
      • 2
      • 3
      • 4
    2. 编写服务提供者实现: 创建一个或多个实现服务接口的类,并在资源目录(src/main/resources)下创建一个META-INF/services目录,在该目录下创建以服务接口的全限定名为名字的文件,文件内容为实现类的全限定名。

      // MyServiceImpl1.java
      public class MyServiceImpl1 implements MyService {
          @Override
          public void doSomething() {
              System.out.println("Implementation 1");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      META-INF/services 目录下创建一个文件 com.example.MyService,其内容为服务提供者实现类的全限定名。

      # META-INF/services/com.example.MyService
      com.example.MyServiceImpl1
      
      • 1
      • 2

      创建多个实现类并在服务提供者文件中列出,可以支持多个实现。

    3. 使用ServiceLoader加载服务: 在客户端代码中使用ServiceLoader来加载并使用服务。

      // MyServiceClient.java
      import java.util.ServiceLoader;
      
      public class MyServiceClient {
          public static void main(String[] args) {
              ServiceLoader<MyService> serviceLoader = ServiceLoader.load(MyService.class);
              for (MyService service : serviceLoader) {
                  service.doSomething();
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      运行这个客户端代码,它将加载并执行在META-INF/services/com.example.MyService文件中列出的所有服务提供者实现类。

    这种方式的好处在于,你可以在不修改客户端代码的情况下替换服务提供者的实现。这对于模块化和可插拔的系统设计非常有用。

    意思就是把各种组件的名字放在一个文件中,用的时候加载进去,然后修改或者添加新的组件就只改这个文件就行

    使用Java的SPI机制,你可以将接口和实现类解耦,并通过在META-INF/services目录下的服务提供者文件中指定实现类的全限定名,达到在不修改客户端代码的情况下替换、添加、移除实现类的目的。

    这种模块化的设计使得系统更加灵活和可插拔。客户端代码不需要硬编码具体的实现类,而是通过ServiceLoader在运行时动态加载服务提供者。当你想要更改或添加实现时,只需修改或添加对应的服务提供者文件,而无需修改客户端代码。

    这种机制在Java中被广泛用于框架和库的设计,允许开发者通过简单的配置或添加jar包的方式扩展和定制功能。这样的设计模式使得系统更容易维护和扩展。

  • 相关阅读:
    python 动态规划(背包问题和最长公共子串)
    利用浏览器DevTools中对React项目进行内存泄露排查
    有什么软件可以免费压缩图片?
    sql小技巧:日期区间和格式化操作
    windows安装mysql时卡write configuration file曲线救国 mysql 5.7.39 免安装(ZIP压缩包)版本安装配置
    sql 基础语法
    汇编经典程序——将一个字节数据以十六进制形式显示
    花朵识别系统Python实现,深度学习卷积神经网络算法
    JLink更新固件成砖头的Q&A
    WPF 中的 ControlTemplate 和 DataTemplate 有什么区别
  • 原文地址:https://blog.csdn.net/u011069294/article/details/134331894