Java API 之 SPI机制
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机制相关推荐
- JAVA拾遗--关于SPI机制
JDK提供的SPI(Service Provider Interface)机制,可能很多人不太熟悉,因为这个机制是针对厂商或者插件的,也可以在一些框架的扩展中看到.其核心类java.util.Serv ...
- JAVA—API和SPI概念
目录 概念 JDBC实例 自己实现一个SPI 总结 概念 英文: What is the difference between Service Provider Interface (SPI) and ...
- java 通知_基于Java API实现通知机制
本节我们来假设这样一个场景:小伙伴们在 C语言中文网提问后,如果指定了老师回答,那么对应的老师就会收到邮件通知,这就是观察者模式的一种应用场景.看到这里,有些小伙伴可能会想到 MQ.异步队列等,其实 ...
- Java中的ClassLoader和SPI机制
深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作. 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK ...
- Java的SPI机制
Dubbo等框架使用到必须掌握. java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api. package org.hadoop. ...
- Java是如何实现自己的SPI机制的? JDK源码(一)
注:该源码分析对应JDK版本为1.8 1 引言 这是[源码笔记]的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码. 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是 ...
- 高级开发必须理解的Java中SPI机制
本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践.学习开源项目提供参考. 1 SPI是什么 SPI全称Service Provider Interface ...
- java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)
注:该源码分析对应JDK版本为1.8 1 引言 这是[源码笔记]的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码. 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是 ...
- JAVA SPI机制概述
SPI概述 1.SPI概念 ①全称:Service Provider Interface ②是什么:是Java提供的一套用来被第三方实现或者扩展的接口,从JDBC4.0,JDK6开始Java实现了SP ...
最新文章
- angularjs---服务(service / factory / provider)
- ecshop 属性自动组合_【深度文章】结构设计中的荷载组合剖析(下)
- python编程难吗-Python、C+这些编程语言难吗?十岁女孩告诉你答案
- 服务器被入侵了?反手溯源出入侵者画像【网络安全】
- SQL Server物化视图学习笔记
- MongoDB数据库(2.MongoDB对数据库的操作以及Mongodb的增删改查)
- mysql查找无根节点sql_SQL 双亲节点查找所有子节点的实现方法
- 工作这几年,同事对我的称呼肉眼可见的在变化着......
- 无法安装操作系统,An unexpected error(0) occurred at line 1768 in f:\nt2\base\boot\setup\arcdisp.c....
- Android的DatePicker和TimePicker-android学习之旅(三十八)
- 如何使用ITEXTSHARP将HTML代码字符串写进PDF
- deepin安装软件dpkg_如何修复Linux中损坏的软件包?
- SpringMVC----视图层框架
- GBDT 如何用于分类问题
- 对皮尔逊相关系数进行假设检验
- 解决谷歌浏览器Chrome不能上网,其他浏览器可以正常上网问题
- freeswitch系列三 SIP软电话xlite、linphonec接入kamailio+freeswitch
- c#写图像tif gdal_C#使用GDAL将tif图像转换为jpg、bmp、png和gif格式的图像
- 【渝粤题库】陕西师范大学163208 饭店管理 作业
- qt 富文本 html,Qt富文本编辑器QTextDocument
热门文章
- java重新_Java程序重新配置教程
- 多继承、经典类与新式类、新式类的C3算法详解
- Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
- Visual Studio Code 使用指南
- NOIP前夕:noi.openjudge,滑雪
- .Net读取rss的两种方法
- 啥叫“Functional Programming ”???
- 十字路口待转区什么用_左转待转区,到底怎样掉头?
- python 数学公式显示_ipython jupyter notebook中显示图像和数学公式实例
- python打印字符串全排列_Python实现全排列的打印