SPI机制


本blog的出现是为了能够分享个人所学的相关知识,检验自身学习成果。内容会和其他技术存在部分关联,如有任何描述错误或者说明有误的地方,还望各位大佬指出。

1. 什么是SPI

1.1 SPI思想

SPI的全名为Service Provider Interface.这个是针对厂商或者插件的。

1.2 SPI约定

1.2.1 Java

当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里创建一个以服务接口命名的文件。

1.2.2 Spring

在jar包的META-INF/目录里创建一个spring.factories,所有spi对应关系都可以写在这个文件中。

2. Spring中的SPI

本文介绍下spring的SPI

2.1 定义一个接口

import org.springframework.context.ApplicationContext;

public interface InitServiceInterFace {
    void init(final ApplicationContext context);
}

2.2 编写一个接口的实现类

import InitServiceInterFace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;

@Slf4j
public class LogInit implements InitServiceInterFace {
    @Override
    public void init(ApplicationContext context) {
        // TODO init LogInit
        log.info("Init My Log.");
    }
}

2.3 新建spi所需静态文件

在Resources静态资源目录下新建spring.factories文件;写入如下内容:

InitServiceInterFace=\
  LogInit

2.4 测试


import InitServiceInterFace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.support.SpringFactoriesLoader;

import java.util.List;

@Slf4j
@SpringBootApplication
public class SpringspiApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringspiApplication.class, args);
        List<InitServiceInterFace> serviceLoader = SpringFactoriesLoader.loadFactories(
                InitServiceInterFace.class, Thread.currentThread().getContextClassLoader());
        for (InitServiceInterFace initServiceInterFace : serviceLoader) {
            initServiceInterFace.init(run);
        }
    }
}

日志输入如下:

SPI-1.png

 上一篇
JAVA线程池 JAVA线程池
本文的出现是为了能够分享个人所学的相关知识,检验自身学习成果。内容会和其他技术存在部分关联,如有任何描述错误或者说明有误的地方,还望各位大佬指出。 1. 了解线程池线程池简单理解就是一次创建多个线程,当一个任务交由线程池执行时,由线
2020-07-02
下一篇 
MinIO MinIO
本文的出现是为了能够分享个人所学的相关知识,检验自身学习成果。内容会和其他技术存在部分关联,如有任何描述错误或者说明有误的地方,还望各位大佬指出。 1. 什么是MinIO1.1 MinIO介绍​ MinIO 是一个基于A
2020-06-29
  目录