本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);
}
}
}
日志输入如下:
