目 录CONTENT

文章目录

JDK中的SPI技术

在水一方
2022-02-02 / 0 评论 / 0 点赞 / 257 阅读 / 934 字 / 正在检测是否收录...

Java 中SPI(Service Provider Interface)是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现
它可以用来启用框架扩展和替换组件。常见的 SPI 有 JDBC、日志门面接口Spring、SpringBoot相关starter组件、Dubbo、JNDI等。
Java SPI 实际上是"基于接口的编程+策略模式+配置文件"组合实现的动态加载机制

案例

  • mysql中的Driver类
    image.png

  • spring-web中也用到了
    image.png
    image.png

如何定义SPI:

1、定义一组接口 (假设是 org.foo.demo.IShout),并写出接口的一个或多个实现

示例

编写接口和接口实现类


public interface Annimal {

    void voice();
}


public class Cat implements Annimal {

    @Override
    public void voice() {
        System.out.println("这是动物的子类:猫");
    }
}


public class Dog implements  Annimal {
    @Override
    public void voice() {
        System.out.println("这是一种很忠诚的动物:狗");

    }
}

编写配置文件

在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个
以接口命名的文件(com.example.meas.entity.Annimal),内容是要应用的实现类(这里是com.example.meas.entity.Cat 和 com.example.meas.entity.Dog,每行一个类)

image.png

测试


        @Test
	public void spiTest(){
		ServiceLoader<Annimal> shouts = ServiceLoader.load(Annimal.class);
		for (Annimal s : shouts) {
			s.voice();
		}
	}

打印结果:
这是动物的子类:猫
这是一种很忠诚的动物:狗

ServiceLoader是jdk中java.util中的类

SPI实现原理

0

评论区