Java SPI机制简述
概述
SPI全称Service Provider Interface,是一种为框架提供良好扩展性的机制。一般由框架开发方定义接口规范(如java.sql.Driver),而第三方厂商为之提供自己的实现(如com.mysql.jdbc.Driver)。借助SPI机制可以达到不修改框架具体实现代码就能根据依赖自动切换具体实现方案(实现类)的效果。
使用
Java SPI使用了策略模式,一个接口多种实现,这一点从概述中我们已经能够体会的到。
框架接口定义
定义一个接口及对应的方法
public interface PrintService{
void printInfo();
}
第三方厂商提供实现
编写该接口的一个实现类,各厂商提供各自的实现
public class PrintServiceImpl implements PrintService{
@Override
public void printInfo(){
System.out.println("hello world");
}
}
第三方厂商创建配置文件
各第三方实现包(项目)需要在resources/META-INF/services目录下,创建一个以接口全路径命名的文件,如com.test.spi.PrintService。用于框架寻找实现类位置。
内容为具体实现类的全路径名,如果有多个,则用分隔符分割。
com.third.spi.PrintServiceImpl
框架中调用SPI的具体实现
SPI的具体实现的调用通过java.util.ServiceLoader来加载具体的实现类。
public static void main(String[] args{
ServiceLoader<PrintService>printLoader=ServiceLoader.load(PrintService.class);
for (PrintService pintService : printerLoader) {
pintService.printInfo();
}
}
总结
通过以上使用,我们可以看出,只有更改不同的第三方厂商提供的依赖包,从而我们的框架会通过ServiceLoader调用同的实现类,从而达到了只修改依赖就变更了具体实现方案的良好扩展效果。
参考资料
《深入理解Apache Dubbo与实战》
Java SPI机制简述的更多相关文章
- Java spi机制浅谈
最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结下java spi机制的思想. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比 ...
- JDK源码解析之Java SPI机制
1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...
- 聊聊Java SPI机制
一.Java SPI机制 SPI(Service Provider Interface)是JDK内置的服务发现机制,用在不同模块间通过接口调用服务,避免对具体服务服务接口具体实现类的耦合.比如JDBC ...
- Java SPI机制实战详解及源码分析
背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...
- 组件化框架设计之Java SPI机制(三)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...
- Java SPI 机制实现解耦与本地化
SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和 ...
- Java SPI机制详解
Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...
- java SPI机制
1. SPI是Service Provider Interfaces的简称.根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务 ...
- Java SPI机制学习笔记
最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...
随机推荐
- SMTP发邮件(直接可用)实例
string file = "邮件测试.txt";//放在Debug下的一个txt文件. MailAddress from = new MailAddress("自己的邮 ...
- Java封装 概述
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式.好处:隐藏实现细节,提供公共的访问方式提高了代码的复用性提高安全性 封装原则:将不需要对外提供的内容都隐藏起来把属性隐藏,提供公共方法对其访 ...
- Java 使用正则表达式和IO实现爬虫以及503解决
我这边找了个小说网站: 基本套路: 第一步:获取小说每一章的url地址 第二步:获取章节url内容并使用正则表达式提取需要的内容 第三步:多线程封装,实现如下效果 最后测试. 代码: 内容获取封装: ...
- windows下部署.netcore+docker系列二 (unbuntu 18.4 下 安装 docker)亲测!!!
1.卸载sudo apt-get remove docker docker-engine docker.io containerd runc2.更新sudo apt-get update3.安装依赖包 ...
- ES6系列-什么是ES6?新手应该怎么理解
ECMAScript 是什么 很多初学者都很困惑,ECMAScript是什么?它跟JavaScript有什么关系? 大家注意到了吗?从题目中我们就可以看出来了,ECMAScript是JavaScrip ...
- tp5--开启与关闭调试模式
https://www.cnblogs.com/finalanddistance/p/8906000.html TP5 显示错误信息 在TP5中,我们运行的代码有错误无法执行时,只显示页面错误,而 ...
- SpringBoot Mybatis-Plus 整合 dynamic-datasource-spring-boot-starter 对数据库进行读写分离
准备工作 对 MySql 进行主从搭建 引入 dynamic-datasource-spring-boot-starter 坐标 引入 druid-spring-boot-starter 坐标 对应框 ...
- 【Linux常见命令】tee命令
tee - read from standard input and write to standard output and files tee命令用于读取标准输入的数据,并将其内容输出成文件. t ...
- 全网最清晰的ConstraintLayout教程
ConstraintLayout是AndroidStudio2.2新增的一个功能,那么这个到底是什么呢?首先第一点我们知道传统的安卓开发,页面基本都是XML编写实现,特别在一些复杂的页面上需要嵌套多层 ...
- RHCS图形界面建立GFS共享下
我们上面通过图形界面实现了GFS,我们这里使用字符界面实现 1.1. 系统基础配置 5台节点均采用相同配置. 配置/etc/hosts文件 # vi /etc/hosts 127.0.0. ...