学习Java中的SPI机制
Posted 泡^泡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习Java中的SPI机制相关的知识,希望对你有一定的参考价值。
Java-SPI是什么
SPI的全称是Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,SPI的作用就是为这些被扩展的API寻找服务实现。
这是网上的一张图:
Java SPI 实际上是“接口+策略模式+配置文件”实现的动态加载机制。
Java-SPI实现步骤
- 创建接口和实现类
- 在resources/META-INF/services/接口全限定名为文件名,内部为全部的实现类全限定名
- ServiceLoader.load进行加载
- 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使用场景
适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。
常见的例子:
- 数据库驱动加载接口实现类的加载
JDBC加载不同类型数据库的驱动。 - 日志门面接口实现类加载。
- SLF4J加载不同提供商的日志实现类。
- Spring
Spring中大量使用了SPI,比如:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等。 - Dubbo
Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口。
https://www.jianshu.com/p/46b42f7f593c
以上是关于学习Java中的SPI机制的主要内容,如果未能解决你的问题,请参考以下文章
Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解
Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解