java spi技术,Java SPI机制
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机制相关推荐
- java内省技术,Java内省技术
一.什么是内省 在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查. 不应该将内省和反射混淆.相对于内省,反射更进一步, ...
- 02)java web项目 使用spi技术 去除web.xml
上一篇提到原理是使用了java的SPI技术 java web项目是在容器运行,如tomcat,weblogic等 了解Tomcat的SPI机制 Tomcat容器在启动时会扫描项目中META-INF/s ...
- Java Rasp技术浅析
前端时间有幸参与到Rasp技术相关的项目中,正好要告一段落,因此今天来科普下这种技术形式与具体应用. (一)Java Instrumentation介绍 Java Instrumentation是从J ...
- 【SPI】java基础之SPI框架实现
1.美图 2.概述 SPI的全名为Service Provider Interface,简单的总结下java spi机制的思想.我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案, ...
- java类加载器以及spi
类加载器概述: 每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class& ...
- gc java root_C#技术漫谈之垃圾回收机制(GC)
GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...
- JAVA中API和SPI的区别
* API(Application Programming Interface ) 在java中,API是指可以用来完成某项功能的类.接口或者方法. SPI(Service Provider Inte ...
- Java探针技术详解
简介 在JVM中运行中,类是通过classLoader加载.class文件进行生成的.在类加载器加载.class文件生成对应的类对象之前时,我们可以通过修改.class文件内容(就是字节码修改技术), ...
- Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制
前言 我们在往期文章中,曾经深入分析过Java的SPI机制,它是一种服务发现机制.具体详见:深入理解JDK的SPI机制 在继续深入Dubbo之前,我们必须先要明白Dubbo中的SPI机制.因为有位大神 ...
最新文章
- [异常笔记] spring cloud 服务消费者启动-2018040501
- mysql导入数据权限_mysql5.7导入数据的权限问题
- python diff函数_使用Python创建你自己的diff工具
- 启动LINUX下的TFTP服务器
- 合并两个数组的两种方式的异同
- Unsatisfied forward or external declaration 错误分析
- 北京地铁挤,最挤昌平线
- R语言manova函数稳健多元方差分析(Robust one-way MANOVA)、rrcov包中的wilks.test函数稳健单向MANOVA、vegan包的adonis函数非参数Manova等效
- 友盟分享 qq没有存储权限 分享失败
- 运维基础——Zabbix:Lack of free swap space on Zabbix server
- 简单易行的用windows系统虚拟苹果mac操作系统 mac下android环境搭建笔记(android studio)
- 陕西省2021年高考成绩位次查询,陕西高考排名查询方法,2021年陕西高考成绩位次全省排名查询...
- 详解Tomcat配置及使用
- 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)
- 《乔布斯传》圈点(2)
- C语言程序用英尺换算公式计算身高的小例子
- TI Sitara AM57x 多核SoC开发板(DSP + ARM)-性能及参数资料
- 《深入设计模式》笔记 -创建型模式二、工厂方法模式
- 答题APP开发解决方案
- pynput控制鼠标键盘