学习
实践
活动
工具
TVP
写文章

Java SPI机制

什么是SPI SPI全称Service Provider Interface,翻译过来是服务提供接口。它是jdk内置的一种服务发现机制,它可以让服务定义与实现分离、解耦,大大提升了程序的扩展性。 Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制,提供了通过interface寻找implement的方法。 使用Java SPI需要符合的约定: Service provider提供Interface的具体实现后,在目录META-INF/services下的文件(以Interface全路径命名)中添加具体实现类的全路径名 SPI加载的核心就是ClassLoader的getResource系列方法,jdk提供了一个工具类,就是上面说的ServiceLoader。 } public void remove() { throw new UnsupportedOperationException(); } } 最后 使用Java

38830

聊聊 Java SPI

The built-in service discovery mechanism in Java Running with Java 11.0.10 SPI (Service Provider Interface 得益于 Java SPI 机制,开发人员只需为第三方预留出 SPI 拓展接口,这样可以在不修改代码的前提下,通过增删第三方依赖来实现系统的灵活拓展。 要想成功地玩转 Java SPI,下面四个组件是缺一不可的: ① Service Provider Interface 服务供应商接口,即SPI拓展接口;只能是接口或抽象类。 众所周知,官方只是制定了一套数据库交互规范,秉持'让专业的人干专业的事'这一原则,官方并没有提供具体的实现,转而将实现逻辑交由各数据库厂商负责。 此外,Java SPI机制有一个较为明显的缺点:无法按需加载指定第三方SPI实现类!!!

2120
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java SPI机制

    : classpath:META-INF/services/xxx.xxx.Calc 内容:需要加载的功能类 如:xxx.xxx.SqrtCalc #org.windwant.spring.core.spi.service.SinCalc org.windwant.spring.core.spi.service.SqrtCalc #org.windwant.spring.core.spi.service.LogCalc 则 运行服务加载类执行 https://github.com/windwant/spring-dubbo-service 官方文档:https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html

    12750

    JavaSPI机制

    java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。 和 API Java spi机制浅谈 java中的SPI机制 1 SPI机制简介 SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的 在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java spi机制的思想。 java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。 2 SPI具体约定 java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。

    14830

    JAVASPI机制

    JAVASPI机制是什么? 是不是看起来很高深的样子.其实特别简单 我们先来一个例子,大家更容易理解什么是JAVASPI机制: 首先我们提供了一个订单处理的接口 /** * @Author: lty * @Date: 2021 SPI的应用 这里我们以JDBC为例子 mysql-connector-java:5.1.32 包的 META-INF/services/ 目录下有个 java.sql.Driver ? //内容为 org.sqlite.JDBC 其它的应用: 日志门面接口实现类加载,SLF4J加载不同提供商的日志实现类 Spring中大量使用了SPI,比如:对servlet3.0规范对ServletContainerInitializer 的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等 Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI

    16510

    java Spi与SpringFactoriesLoader

    其使用的方式和javaspi基本类似,我们可以先学习javaspi而且进一步学习SpringFactoriesLoader。 一、java spi 1、什么是Spi SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。 2、Spi的应用场景 SPI ( Service Provider Interface) 是 调用方 来制定接口规范,提供给外部来实现,调用方在调用时则 选择自己需要的外部实现。 从使用人员上来说,SPI 被框架扩展人员使用。

    23030

    Java SPI 与 Dubbo SPI 有什么区别?

    JavaSPI是被用来设计给服务提供商做插件使用的。基于策略模式来实现动态加载的机制。 1、Java SPI 核心类:java.util.ServiceLoader ? 服务是一组众所周知的接口和(通常是抽象的)类。服务提供者是服务的特定实现。 另外,Java 核心技术系列教程和示例源码整理好了:https://github.com/javastacks/javastack Java SPI 不足之处: 不能按需加载。 Java SPI在加载扩展点的时候,会一次性加载所有可用的扩展点,很多是不需要的,会浪费系统资源 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类 到这里就有点明白了,又看到了熟悉的ServiceLoad.load(),这不是刚才讲的Java SPI嘛。

    24230

    Java-SPI机制

    Java--SPI机制 SPI全称为Service Provider Interface,是JDK内置的一种服务提供发现机制。简单来说,它就是一种动态替换发现机制。 这些SPI的接口是由Java核心库来提供,而SPI的实现则是作为Java应用所依赖的jar包被包含进类路径(CLASSPATH)中。例如:JDBC的实现mysql就是通过maven被依赖进来。 那么问题来了,SPI的接口是Java核心库的一部分,是由引导类加载器(Bootstrap Classloader)来加载的。 不过,在距离之前,还是想对spi的使用进行一个简单的说明。 spi使用 首先,通过一张图来看,完成spi的实现,需要哪些操作,需要遵循哪些规范? ? spi规范 1.代码编写 既然是spi,那么就必须先定义好接口。其次,就是定义好接口的实现类。

    70340

    Java SPI机制浅析

    这就是使用了SPI机制。如: mysql-connector ? JDK中的nio SPI ? 再如,logback-classic ? 接下来,我们就来聊聊java SPI机制,文章内容主要包含如下几个部分: SPI概念和规范 根据规范编写一个简单的SPI 小结 一、SPI概念和规范 1.1 SPI概念 SPI全称为Service 比如JDBC的数据库驱动模块,不同数据库连接驱动接口相同但实现类不同,通常各大厂商(如Mysql、Oracle)会根据一个统一的规范(java.sql.Driver)开发各自的驱动实现逻辑。 1.2 SPI规范 使用SPI也需要遵循一定的规范,主要包含如下几点: 需要设置/META-INF/目录 /META-INF/services 放到classpath下 /META-INF/services 使用ServiceLoader package com.wangmengjun.tutorial.spi; import java.util.Iterator; import java.util.ServiceLoader

    28030

    Java SPI机制详解

    我们经常遇到的就是java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,mysql和postgresql都有不同的实现提供给用户,而JavaSPI机制可以为某个接口寻找服务实现 类图中,接口对应定义的抽象SPI接口;实现方实现SPI接口;调用方依赖SPI接口。 SPI接口的定义在调用方,在概念上更依赖调用方;组织上位于调用方所在的包中;实现位于独立的包中。 Java SPI 应用实例 当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类 而JDBC4.0之后不需要Class.forName来加载驱动,直接获取连接即可,这里使用了JavaSPI扩展机制来实现。 这里就涉及到使用JavaSPI扩展机制来查找相关驱动的东西了,关于驱动的查找其实都在DriverManager中,DriverManager是Java中的实现,用来获取数据库连接,在DriverManager

    76220

    javaSPI机制

    java SPI功能分享 1.什么是SPI SPI,Service Provider Interface,是有java提供的一套用来被第三方实现或者扩展的API,本质是通过基于接口的编程+策略模式+配置文件实现动态加载 主要是被框架的开发人员使用,比如JDBC中驱驱动java.sql.Driver接口,不同的数据库厂商通过实现次接口完成对数据库的操作,mysql等数据库都有不同的实现类提供给用户,而JavaSPI机制可以为某个接口寻找具体的实现类 使用分析 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成 实现解耦,不需要改动源码就可以实现扩展 缺点:JDK标准的SPI会一次性实例化扩展点所有实现,如果有扩展实现则初始化很耗时(比如静态代码块初始化耗时长),如果没 用上也加载,则浪费资源 6.SPI机制的其他应用 Dubbo、spring、log4j等框架也大量使用了SPI机制

    14920

    Java基础之SPI机制

    欢迎访问陈同学博客原文 在前几天的译文 Java中的类加载器 中有部分关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。 什么是SPIJava中使用SPI机制的例子很多,例举几个: 数据库驱动 ( java.sql.Driver ),各数据库厂商(Mysql、Oracle等)可以遵守规范独立开发自己的驱动 Servlet容器初始化接口 ,像计算机行业的各种规范、协议也是类似的。 命名的文件,内容为三位实现者: org.utopiavip.spi.Cat org.utopiavip.spi.Dog org.utopiavip.spi.Cuckoo 将项目打成jar包。 :大佬们定规矩(规范),兄弟们实现后放到约定的地方(META-INF/service/),包装上写好是啥东西(接口全限定名),包装里写清楚东西放哪儿了(实现类全限定名)。

    41020

    javaspi机制简介

    一、什么是SPI机制 SPI机制,是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。 引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔,SPI实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载,为某个接口寻找服务实现的机制 二、SPI 具体约定 java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。 jdk提供服务实现查找的一个工具类:java.util.ServiceLoader 三、应用场景 1、可替换的插件机制 典型应用,jdbc的实现机制。 通常各大厂商(如Mysql、Oracle)会根据一个统一的规范(java.sql.Driver)开发各自的驱动实现逻辑。客户端使用jdbc时不需要去改变代码,直接引入不同的spi接口服务即可。

    86930

    Java SPI机制与应用

    SPI全称Service Provider Interface, 是Java提供的一套用来被第三方实现或者扩展的接口 实际上是"基于接口的编程+策略模式+配置文件"组合实现的动态加载机制, 更是设计模式的生动体现 │ └─org │ └─test │ AliyunCDN.java │ QiniuCDN.java │ Test.java │ UploadFile.java └─resources └─META-INF , 比如: 对Servlet3.0规范对ServletContainerInitializer的实现(Tomcat加载SpringBoot项目的War包)/自动类型转换Type Conversion SPI Dubbo Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口 JDBC JDBC4.0以后不再需要Class.forName

    12100

    Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI

    Java SPI 通过完成一个 Java SPI 的操作来了解它的机制。 就这样,一个 Java SPI 就实现完成了,通过 ServiceLoader.load 获取加载所有接口已配置的接口实现类,然后可以遍历找出需要的实现。 Dubbo SPI 本文 Dubbo 版本为 2.7.5 Dubbo SPI 相较于 Java SPI 更为强大,并且都是由自己实现的一套 SPI 机制。 其中主要的改进和优化: 相对于 Java SPI 一次性加载所有实现,Dubbo SPI 是按需加载,只加载需要使用的实现类。同时带有缓存支持。 更为详细的扩展加载失败信息。 例如 Cat 的配置文件内容: cat = top.ytao.demo.spi.Cat Dubbo SPI 加载过程中,对 Java SPI 的目录也是可以被兼容的。

    41620

    Java SPI原理与源码分析

    Java SPI原理与源码分析 ? http接口,不用业务领域之间通过rpc接口等 SPI:侧重于扩展能力,使用群体偏底层框架扩展人员,根据SPI规范扩展某种能力,供业务开发人员使用 对于API与SPI的区别我们可以用一张图更清晰的表现出来 都有不同的实现提供给用户,而JavaSPI机制可以为某个接口寻找服务实现。 应用场景 SPI有很多应用场景,最典型的就是数据库驱动,对于jdbc来说,官方只定义了规范,具体的实现由各个厂商自己负责,然后java通过DriverManager将驱动加载进来供程序使用。 可以对比java内置SPI和Dubbo的SPI机制来加深对SPI的理解。

    20530

    JAVA SPI 是怎么实现的?

    JAVA SPI 是怎么实现的? SPI 是什么? SPI(Service Provider Interface) ,是 JDK 内置的一种提供发现机制。SPI 是一种动态替换发现的机制。 ? SPI类图 JAVA SPI 实现 定义一组接口,接口有多种实现 public interface IShout { void shout(); } public class Cat implements 把实例化后的类缓存到providers对象中 JAVA SPI 应用场景 数据库DriverManager、Spring、ConfigurableBeanFactory等都用到了SPI机制。 而JDBC4.0之后不需要Class.forName来加载驱动,直接获取连接即可,这里使用了JavaSPI扩展机制来实现。 在mysql-connector-java-5.1.45.jar中,META-INF/services目录下会有一个名字为java.sql.Driver的文件: com.mysql.jdbc.Driver

    34120

    Java命名规范

    Java命名规范 定义规范的目的是为了使项目的代码样式统一,使程序有良好的可读性。 包的命名  (全部小写,由域名定义) Java包的名字都是由小写单词组成。 但是由于Java面向对象编程的特性,每一名Java程序员都 可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀 例如:MAX_VALUE 参数的命名 参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。 Javadoc注释 Java除了可以采用我们常见的注释方式之外,Java语言规范还定义了一种特殊的注释,也就是我们 所说的Javadoc注释,它是用来记录我们代码中的API的。 变量和常量命名 变量的命名 主要的的命名规范有以下三种: Camel 标记法:首字母是小写的,接下来的单词都以大写字母开头 Pascal 标记法:首字母是大写的,接下来的单词都以大写字母开头

    2K100

    Java代码规范

    如何更规范化编写Java 代码的重要性想必毋需多言,其中最重要的几点当属提高代码性能、使代码远离Bug、令代码更优雅。 反例: <select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="<em>java</em>.lang.Integer 会对其进行优化,但是在循环中字符串的拼接<em>Java</em> 编译期无法执行优化,所以需要使用StringBuilder 进行替换。 反例: //在循环中拼接字符串反例 String str = ""; for (int i = 0; i < 10; i++){ //在循环中字符串拼接Java 不会对其进行优化 str += //在循环中拼接字符串正例 String str1 = "Love"; String str2 = "Courage"; String strConcat = str1 + str2; //Java

    9920

    扫码关注腾讯云开发者

    领取腾讯云代金券