学习Java中的SPI机制

Posted 泡^泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习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

以上是关于学习Java中的SPI机制的主要内容,如果未能解决你的问题,请参考以下文章

Java SPI 机制在 Flink 中的应用(源码分析)

一文搞懂Java/框架中的SPI机制

Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解

Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解

Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解

Java中的SPI机制