Java中的 SPI 机制

描述 service provider interface

SPI 是 JDK 内置的一种服务提供发现机制。目前市面上有很多框架都是用它来做服务的扩展发现。简单来说,它是一种动态替换发现的机制。举个简单的例子,我们想在运行时动态给它添加实现,你只需要添加一个实现,然后把新的实现描述给 JDK 知道就行了。

比如mysql 作为最终服务商,会有多个下辖实现厂商与之对接,那如何保证对接中的规范呢?
mysql就提供了一组标准接口,然后不同的厂商可以有不同的实现。

JDK 中的实现

  • 1:A服务定义接口
package com.rentao.spi;

public interface DatabaseDriver {
    
    

    String buildConnect(String txt);
}
  • 2: B 服务实现接口
package com.grentao.spi;

public class OracleDriver implements DatabaseDriver{
    
    
    @Override
    public String buildConnect(String s) {
    
    
        return "Oracle Driver:"+s;
    }
}
  • 3:B服务增加配置项 META-INF.services
文件名称:接口名称-package com.rentao.spi.DatabaseDriver
文件内容:接口实现类的全路径名称-package com.grentao.spi.OracleDriver
  • 4:启动A服务,完成调用
ServiceLoader<DatabaseDriver> serviceLoader=ServiceLoader.load(DatabaseDriver.class);
for(DatabaseDriver databaseDriver:serviceLoader){
    
    
    System.out.println(databaseDriver.buildConnect("test"));
}

实现 SPI 需要遵循的标准

1. 需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/service
2. 在该目录下创建一个 properties 文件,该文件需要满足以下几个条件
2.1 文件名必须是扩展的接口的全路径名称
2.2 文件内部描述的是该扩展接口的所有实现类
2.3 文件的编码格式是 
3. 通过 java.util.ServiceLoader 的加载机制来发现

猜你喜欢

转载自blog.csdn.net/weixin_44971379/article/details/120805613