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/

转载于:https://www.cnblogs.com/lay2017/p/11194625.html

Java API 之 SPI机制相关推荐

  1. JAVA拾遗--关于SPI机制

    JDK提供的SPI(Service Provider Interface)机制,可能很多人不太熟悉,因为这个机制是针对厂商或者插件的,也可以在一些框架的扩展中看到.其核心类java.util.Serv ...

  2. JAVA—API和SPI概念

    目录 概念 JDBC实例 自己实现一个SPI 总结 概念 英文: What is the difference between Service Provider Interface (SPI) and ...

  3. java 通知_基于Java API实现通知机制

    本节我们来假设这样一个场景:小伙伴们在 C语言中文网提问后,如果指定了老师回答,那么对应的老师就会收到邮件通知,这就是观察者模式的一种应用场景.看到这里,有些小伙伴可能会想到 MQ.异步队列等,其实 ...

  4. Java中的ClassLoader和SPI机制

    深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作. 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK ...

  5. Java的SPI机制

    Dubbo等框架使用到必须掌握. java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api. package org.hadoop. ...

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

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

  7. 高级开发必须理解的Java中SPI机制

    本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践.学习开源项目提供参考. 1 SPI是什么 SPI全称Service Provider Interface ...

  8. java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)

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

  9. JAVA SPI机制概述

    SPI概述 1.SPI概念 ①全称:Service Provider Interface ②是什么:是Java提供的一套用来被第三方实现或者扩展的接口,从JDBC4.0,JDK6开始Java实现了SP ...

最新文章

  1. angularjs---服务(service / factory / provider)
  2. ecshop 属性自动组合_【深度文章】结构设计中的荷载组合剖析(下)
  3. python编程难吗-Python、C+这些编程语言难吗?十岁女孩告诉你答案
  4. 服务器被入侵了?反手溯源出入侵者画像【网络安全】
  5. SQL Server物化视图学习笔记
  6. MongoDB数据库(2.MongoDB对数据库的操作以及Mongodb的增删改查)
  7. mysql查找无根节点sql_SQL 双亲节点查找所有子节点的实现方法
  8. 工作这几年,同事对我的称呼肉眼可见的在变化着......
  9. 无法安装操作系统,An unexpected error(0) occurred at line 1768 in f:\nt2\base\boot\setup\arcdisp.c....
  10. Android的DatePicker和TimePicker-android学习之旅(三十八)
  11. 如何使用ITEXTSHARP将HTML代码字符串写进PDF
  12. deepin安装软件dpkg_如何修复Linux中损坏的软件包?
  13. SpringMVC----视图层框架
  14. GBDT 如何用于分类问题
  15. 对皮尔逊相关系数进行假设检验
  16. 解决谷歌浏览器Chrome不能上网,其他浏览器可以正常上网问题
  17. freeswitch系列三 SIP软电话xlite、linphonec接入kamailio+freeswitch
  18. c#写图像tif gdal_C#使用GDAL将tif图像转换为jpg、bmp、png和gif格式的图像
  19. 【渝粤题库】陕西师范大学163208 饭店管理 作业
  20. qt 富文本 html,Qt富文本编辑器QTextDocument

热门文章

  1. java重新_Java程序重新配置教程
  2. 多继承、经典类与新式类、新式类的C3算法详解
  3. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
  4. Visual Studio Code 使用指南
  5. NOIP前夕:noi.openjudge,滑雪
  6. .Net读取rss的两种方法
  7. 啥叫“Functional Programming ”???
  8. 十字路口待转区什么用_左转待转区,到底怎样掉头?
  9. python 数学公式显示_ipython jupyter notebook中显示图像和数学公式实例
  10. python打印字符串全排列_Python实现全排列的打印