Java组件一个更为人熟知的名词“服务”,与流行的微服务有所区别。

以往加载JDBC驱动使用如下方式:Class.forName()

Java 1.6引入SPI机制,使用DriverManager创建数据连接,背后是SPI机制保证组件正确加载。ServiceLoader loadedDrivers = ServiceLoader.load(Driver.class);

SPI

以JDBC为例说明SPI工作的原理。

Service Provider Interfacejava.sql.Driver

定义驱动程序行为。SPI中此类被称为Service Provider Interface。

Service Providercom.mysql.cj.jdbc.Driver

Driver的具体实现。SPI中此类被称为Service Provider。

配置文件

SPI要求Service Provider实现Service Provider Interface时,明确标注服务入口。

即,在jar包中用一个文件将程序入口类列出来,该文件即配置。文件名及位置都有明确要求。

位置META-INF/services

文件

名称:Service Provider Interface全类名

内容:Service Provider全类名

如下图所示:

加载机制/Service Loader

SPI服务调用相当简单,将服务jar包引入工程,使用ServiceLoader加载服务,如:ServiceLoader loadedDrivers = ServiceLoader.load(Driver.class);

ServiceLoader在classpath下搜索spi配置文件。

DriverManager加载驱动后,只需要一行代码就能获取JDBC连接。Connection conn = DriverManager.getConnection(url,username,password);

四个主要组件

服务提供者接口:服务具有的行为。

服务提供者:服务具体实现。

SPI配置文件:用于配置服务入口。

ServiceLoader:加载具体服务实现。

ServiceLoader方法

load():

加载SPI服务的静态方法。

findFirst():

从众多服务提供者中选一个。

forEach():

遍历服务接口下的所有服务提供者。

reload():

重新加载服务提供者。

SPI应用

Java提供了众多SPI,以下是接口及服务:

CurrencyNameProvider:为 Currency类提供本地化的货币符号。

LocaleNameProvider:为 Locale类提供本地化名称。

TimeZoneNameProvider:为 TimeZone类提供本地化的时区名称。

DateFormatProvider:提供指定区域设置的日期和时间格式。

NumberFormatProvider:为 NumberFormat类提供货币,整数和百分比值。

Driver:从4.0版开始,JDBC API支持SPI模式。

PersistenceProvider:提供JPA API的实现。

JsonProvider:提供JSON处理对象。

JsonbProvider:提供JSON绑定对象。

Extension:为CDI容器提供扩展。

ConfigSourceProvider:提供检索配置属性的源。

Spring Boot组件集成也依赖这一思想,不过spring有自己的实现。

java spi技术,Java SPI机制相关推荐

  1. java内省技术,Java内省技术

    一.什么是内省 在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查. 不应该将内省和反射混淆.相对于内省,反射更进一步, ...

  2. 02)java web项目 使用spi技术 去除web.xml

    上一篇提到原理是使用了java的SPI技术 java web项目是在容器运行,如tomcat,weblogic等 了解Tomcat的SPI机制 Tomcat容器在启动时会扫描项目中META-INF/s ...

  3. Java Rasp技术浅析

    前端时间有幸参与到Rasp技术相关的项目中,正好要告一段落,因此今天来科普下这种技术形式与具体应用. (一)Java Instrumentation介绍 Java Instrumentation是从J ...

  4. 【SPI】java基础之SPI框架实现

    1.美图 2.概述 SPI的全名为Service Provider Interface,简单的总结下java spi机制的思想.我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案, ...

  5. java类加载器以及spi

    类加载器概述: 每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class& ...

  6. gc java root_C#技术漫谈之垃圾回收机制(GC)

    GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...

  7. JAVA中API和SPI的区别

    * API(Application Programming Interface ) 在java中,API是指可以用来完成某项功能的类.接口或者方法. SPI(Service Provider Inte ...

  8. Java探针技术详解

    简介 在JVM中运行中,类是通过classLoader加载.class文件进行生成的.在类加载器加载.class文件生成对应的类对象之前时,我们可以通过修改.class文件内容(就是字节码修改技术), ...

  9. Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制

    前言 我们在往期文章中,曾经深入分析过Java的SPI机制,它是一种服务发现机制.具体详见:深入理解JDK的SPI机制 在继续深入Dubbo之前,我们必须先要明白Dubbo中的SPI机制.因为有位大神 ...

最新文章

  1. [异常笔记] spring cloud 服务消费者启动-2018040501
  2. mysql导入数据权限_mysql5.7导入数据的权限问题
  3. python diff函数_使用Python创建你自己的diff工具
  4. 启动LINUX下的TFTP服务器
  5. 合并两个数组的两种方式的异同
  6. Unsatisfied forward or external declaration 错误分析
  7. 北京地铁挤,最挤昌平线
  8. R语言manova函数稳健多元方差分析(Robust one-way MANOVA)、rrcov包中的wilks.test函数稳健单向MANOVA、vegan包的adonis函数非参数Manova等效
  9. 友盟分享 qq没有存储权限 分享失败
  10. 运维基础——Zabbix:Lack of free swap space on Zabbix server
  11. 简单易行的用windows系统虚拟苹果mac操作系统 mac下android环境搭建笔记(android studio)
  12. 陕西省2021年高考成绩位次查询,陕西高考排名查询方法,2021年陕西高考成绩位次全省排名查询...
  13. 详解Tomcat配置及使用
  14. 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)
  15. 《乔布斯传》圈点(2)
  16. C语言程序用英尺换算公式计算身高的小例子
  17. TI Sitara AM57x 多核SoC开发板(DSP + ARM)-性能及参数资料
  18. 《深入设计模式》笔记 -创建型模式二、工厂方法模式
  19. 答题APP开发解决方案
  20. pynput控制鼠标键盘

热门文章

  1. Python getattr() 函数
  2. Flask Jinja2 模板中的变量和过滤器
  3. c#常用类库----计算机信息类
  4. 原生开发安卓/iOS,Visual Studio迎神器扩展
  5. 两个fetion飞信API
  6. 深度学习《Transfer Learning》
  7. 漫步微积分一 —— 引言
  8. 数据挖掘基础数学知识博客
  9. 数据结构——归并排序
  10. 吴恩达深度学习 —— 4.1 深层神经网络