学习Java中的SPI机制

Java-SPI是什么

SPI的全称是Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,SPI的作用就是为这些被扩展的API寻找服务实现。
这是网上的一张图:
在这里插入图片描述
Java SPI 实际上是“接口+策略模式+配置文件”实现的动态加载机制。

Java-SPI实现步骤

  1. 创建接口和实现类
  2. 在resources/META-INF/services/接口全限定名为文件名,内部为全部的实现类全限定名
  3. ServiceLoader.load进行加载
  4. SPI实现类必须带一个无参的构造函数

Java-SPI的案例

在这里插入图片描述

package com;

public interface Animal {
    
    
    void sayHello();
}
package com;

public class Cat implements Animal {
    
    
    @Override
    public void sayHello() {
    
    
        System.out.println("my name is cat");
    }
}
package com;

public class Dog implements Animal {
    
    
    @Override
    public void sayHello() {
    
    
        System.out.println("my name is dog");
    }
}

在这里插入图片描述
在这里插入图片描述

package com;

import java.util.ServiceLoader;

public class SpiTest {
    
    
    public static void main(String[] args) {
    
    
       ServiceLoader<Animal> animals = ServiceLoader.load(Animal.class);
       for (Animal animal : animals){
    
    
           animal.sayHello();
       }
    }
}

在这里插入图片描述

Java-SPI使用场景

适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。

常见的例子:

  1. 数据库驱动加载接口实现类的加载
    JDBC加载不同类型数据库的驱动。
  2. 日志门面接口实现类加载。
  3. SLF4J加载不同提供商的日志实现类。
  4. Spring
    Spring中大量使用了SPI,比如:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等。
  5. Dubbo
    Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口。

https://www.jianshu.com/p/46b42f7f593c

猜你喜欢

转载自blog.csdn.net/xiaowanzi_zj/article/details/121588622