Java中的SPI机制基础讲解

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值