我是靠谱客的博主 轻松奇迹,最近开发中收集的这篇文章主要介绍Java中的SPI机制基础讲解1.什么是SPI2.案例展示 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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.案例展示 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部