概述
1.什么是SPI
SPI全称为 Service Provider Interface,直译为 服务提供者接口
简单来说,SPI通过将服务的接口与实现分离以实现解耦,提高程序拓展性的机制,达到插拔式的效果。相同的标准,各服务厂商可以提供不同的实现。这尤其适合于面对未知的实现或者对拓展开放的系统,可以先行制定标准,服务提供者根据标准提供实现即可。
Java中使用SPI机制的例子很多,例举几个:
- 数据库驱动 ( java.sql.Driver ),各数据库厂商(Mysql、Oracle等)可以遵守规范独立开发自己的驱动
- Servlet容器初始化接口( javax.servlet.ServletContainerInitializer ),Tomcat提供了实现
- Apache common-logging 中提供的日志接口,许多日志框架做了实现
稍微延伸一下,其实不仅仅是Java,像计算机行业的各种规范、协议也是类似的。甚至生活中的例子,如:
- 命题作文:设立标题,大家各自发挥成文
- 手机壳:根据手机尺寸标准,实现各式各样的手机壳
- 喜剧:以逗笑观众为标准,各表演者以不同的作品与形式为观众送去欢乐
2.案例展示
首先,了解下SPI机制的约定(约定优于配置理念):
- 在
META-INF/services/
目录下创建一个以 接口全限定名 命名的文件,文件内容为 实现类的全限定名 - 使用 java.util.ServiceLoader 来动态加载
META-INF/services/
下的实现类 - 实现类必须有一个无参构造器
假设森林动物园举行歌唱比赛,各参赛动物选手需高歌一曲。我们定义一个接口 Animal
,标准为 sing()
唱歌。
2.1.创建一个普通maven项目,创建以下对象
// Animal接口, 制定了 sing() 标准
public interface Animal {
void sing();
}
2.2.三位参赛选手,分别实现了sing()
标准
//Cat.java
public class Cat implements Animal {
public void sing() {
System.out.println("喵~");
}
}
//Cuckoo.java
public class Cuckoo implements Animal {
public void sing() {
System.out.println("布谷~");
}
}
//Dog.java
public class Dog implements Animal {
public void sing() {
System.out.println("汪~");
}
}
2.3.在resource下创建META-INF/services
目录,下面创建以接口全限定名org.utopiavip.spi.Animal
命名的文件,内容为三位实现者
org.utopiavip.spi.Cat
org.utopiavip.spi.Dog
org.utopiavip.spi.Cuckoo
将项目打成jar包
2.4.在另一个项目中引入该jar包
public class SpiDemo {
public ServiceLoader<Animal> serviceLoader = ServiceLoader.load(Animal.class);
public static void main(String args[]) {
SpiDemo spiDemo = new SpiDemo();
spiDemo.sing();
}
public void sing() {
for (Animal singer : serviceLoader) {
singer.sing();
}
}
}
运行后输出如下:
喵~
汪~
布谷~
内容转载:Java 基础之 SPI 机制|java,spi,ContextClassLoader,类加载器|cyj
最后
以上就是轻松奇迹为你收集整理的Java中的SPI机制基础讲解1.什么是SPI2.案例展示 的全部内容,希望文章能够帮你解决Java中的SPI机制基础讲解1.什么是SPI2.案例展示 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复