SPI

SPI全称是service provider interface,是Java定义的一套服务发现机制,如图:

调用方只需要面向接口,接口的实现由第三方自己去实现,服务启动的时候会自动去发现该服务接口的实现并加载。

代码示例

定义一个接口

随意定义一个接口Speaker

SpiTest

ServiceLoader加载Speaker接口的实现类,将会默认查找META-INF/services目录下的 “cn.lay.demo.spi.Speaker” 文件的内容

这里的cn.lay.demo.spi.Speaker是一个文件名,和Speaker接口全限定名一致

serviceLoader:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/ServiceLoader.html

cn.lay.demo.spi.Speaker文件

文件指明了实现类

实现类

总结

整个流程大体是:

1、serviceloader加载接口的配置文件

2、根据配置文件配置的实现类加载实现类的实例

所以Java SPI的核心就是:面向接口 + 配置文件 + 多态

参考文章

https://www.jianshu.com/p/46b42f7f593c

https://cxis.me/2017/04/17/Java%E4%B8%ADSPI%E6%9C%BA%E5%88%B6%E6%B7%B1%E5%85%A5%E5%8F%8A%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/

Java API 之 SPI机制的更多相关文章

  1. 【Java】深入理解Java中的spi机制

    深入理解Java中的spi机制 SPI全名为Service Provider Interface是JDK内置的一种服务提供发现机制,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用 ...

  2. 结合实战和源码来聊聊Java中的SPI机制?

    写在前面 SPI机制能够非常方便的为某个接口动态指定其实现类,在某种程度上,这也是某些框架具有高度可扩展性的基础.今天,我们就从源码级别深入探讨下Java中的SPI机制. 注:文章已收录到:https ...

  3. JAVA—API和SPI概念

    JAVA—API和SPI概念 目录 概念 JDBC实例 自己实现一个SPI 总结 概念英文: What is the difference between Service Provider Inter ...

  4. Java基础之SPI机制

    SPI 机制,全称为 Service Provider Interface,是一种服务发现机制.它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件 ...

  5. java中的SPI机制

    1 SPI机制简介 SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的.在java.util.ServiceLoader的文档里 ...

  6. Java 中的 SPI 机制是什么鬼?高级 Java 必须掌握!

    作者:sigangjun blog.csdn.net/sigangjun/article/details/79071850 SPI的全名为:Service Provider Interface,大多数 ...

  7. java中高级并发SPI机制

    Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制. 适用于:调用者根据实际使用需要,启用.扩展.或者替换框架的实现策略. 要使用Java SPI,需要遵循如下约定 ...

  8. java 的SPI机制

    今天看到spring mvc 使用Java Validation Api(JSR-303)进行校验,需要加载一个 其具体实现(比如Hibernate Validator), 本来没有什么问题,但是突然 ...

  9. Java是如何实现自己的SPI机制的? JDK源码(一)

    注:该源码分析对应JDK版本为1.8 1 引言 这是[源码笔记]的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码. 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是 ...

随机推荐

  1. 客户端配置代理服务实现yum上外网

    vi  /etc/profile http_proxy=http://172.20.188.193:3128/https_proxy=https://172.20.188.193:3128/expor ...

  2. Android 显示系统:飞思卡尔平台图形界面与GPU硬件加速

    图形是Android平台中的一个大主题,包含java/jni图形框架和2d/3d图形引擎(skia.OpenGL-ES.renderscript). 本文档描述了飞思卡尔设备上的一般Android图形 ...

  3. C++数据结构之排序

    一.简单排序 冒泡排序: 插入排序: 逆序对 希尔排序:

  4. springmvc+spring+mybatis 项目配置

    前提 工作环境:JDK 1.8.Mysql 5.7.18.Intellij IDEA 2018.1.Tomcat 8.5.Maven 框架版本:Spring 4.2.0.RELEASE.SpringM ...

  5. 《剑指offer》递推与循环,栈和队列,回溯 (牛客10.27)

    难度 题目 知识点 07. 斐波那契数列 递推递归 - 两变量写法- 08. 跳台阶 同上 09. 变态跳台阶 dp 10. 矩形覆盖 同上 05. 用两个栈实现队列 模拟 ☆ 20. 包含min函数 ...

  6. 解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

    解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes 当项目依赖其他jar ...

  7. springboot datajpa 简明说明

    findById返回Optional的使用 查询 public Object lookupDevice(Integer id) { return deviceJpa.findById(id).orEl ...

  8. Kali基础

    1.Kali Linux 2.0 发布下载,基于 Debian 的 Linux 发行版  http://www.linuxidc.com/Linux/2015-08/121549.htm 2. Kal ...

  9. POJ3311 Hie with the Pie 【状压dp/TSP问题】

    题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total ...

  10. 《C专家编程》读书笔记之第8~11章

    八.为什么程序员无法分清万圣节和圣诞节 1. 整形提升是指char,short int和位段类型(无论signed或unsigned)以及枚举类型将被提升为int或unsigned int(如果int ...