SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。
简单的总结下java spi机制的思想。
我们系统里抽象的各个模块,往往有很多不同的实现方案,
比如日志模块的方案,xml解析模块、jdbc模块的方案等。
面向的对象的设计里,我们一般推荐模块之间基于接口编程,
模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,
就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。
为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。
java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。
有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。
java spi的具体约定如下 :
当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。
该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,
并装载实例化,完成模块的注入。
基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。
jdk提供服务实现查找的一个工具类:java.util.ServiceLoader
最常见的例子
1.common-logging
apache最早提供的日志的门面接口。只有接口,
没有实现。具体方案由各提供商实现,
发现日志提供商是通过扫描 META-INF/services/org.apache.commons.logging.LogFactory配置文件,
通过读取该文件的内容找到日志提工商实现类。只要我们的日志实现里包含了这个文件,并在文件里制定 LogFactory工厂接口的实现类即可。
2.jdbc
jdbc4.0以前,
开发人员还需要基于Class.forName("xxx")的方式来装载驱动,
jdbc4也基于spi的机制来发现驱动提供商了,
可以通过META-INF/services/java.sql.Driver文件里指定实现类的方式来暴露驱动提供者。
具体步骤
一个内容管理系统有一个搜索模块。是基于接口编程的。
搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索
接口定义如下
package my.xyz.spi; import java.util.List; public interface Search { public List serch(String keyword); }
A公司采用文件系统搜索的方式实现了 Search接口,B公司采用了数据库系统的方式实现了Search接口
com.A.spi.impl.FileSearch com.B.spi.impl.DatabaseSearch
那么A公司发布 实现jar包时,则要在jar包中META-INF/services/my.xyz.spi.Search文件中写下如下内容
com.A.spi.impl.FileSearch
那么B公司发布 实现jar包时,则要在jar包中META-INF/services/my.xyz.spi.Search文件中写下如下内容
com.B.spi.impl.DatabaseSearch
测试代码
package com.xyz.factory; import java.util.Iterator; import java.util.ServiceLoader; import my.xyz.spi.Search; public class SearchFactory { private SearchFactory() { } public static Search newSearch() { Search search = null; ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class); Iterator<Search> searchs = serviceLoader.iterator(); if (searchs.hasNext()) { search = searchs.next(); } return search; } }
package my.xyz.test; import java.util.Iterator; import java.util.ServiceLoader; import com.xyz.factory.SearchFactory; import my.xyz.spi.Search; public class SearchTest { public static void main(String[] args) { Search search = SearchFactory.newSearch(); search.serch("java spi test"); } }
相关推荐
Java SPI 机制详解 Java SPI 机制,全称 Service Provider Interface,是 Java 内置的...Java SPI 机制是一个强大的服务发现机制,广泛应用于许多框架和库中。SPI 机制的解耦和可扩展性特点使得程序更加灵活和可维护。
而SPI机制则提供了一种通用的方式来扩展Java平台功能,使得Java开发者可以在不修改源码的情况下增强平台或第三方库的功能。在实际开发过程中,深入理解和正确使用这两个机制,对于提升软件的灵活性、可维护性以及可...
Java SPI 机制详解 Java SPI(Service Provider Interface)机制是一种服务提供发现机制,能够实现框架的扩展和替换组件,主要被框架的开发人员使用。SPI 机制的核心思想是将装配的控制权移到程序之外,在模块化...
在Java的SPI机制实例详解中,ServiceLoader类是核心类,负责加载服务提供商的实现类。ServiceLoader类使用META-INF/services目录下的配置文件来查找服务提供商的实现类,并将其加载到Java应用程序中。开发者可以通过...
Java的Service Provider Interface (SPI) 是一种用于在运行时动态发现和加载服务提供者实现的机制。这个功能在Java标准库中被广泛使用,允许开发者扩展JVM的功能,而无需修改核心API。在这个"java的spi测试"中,我们...
服务接口定义:在SPI机制中,首先我们需要定义一个服务接口,这个接口定义了对外公开的方法,供其他组件调用。例如,我们可以定义一个名为`ServiceProvider`的接口: ```java public interface ServiceProvider { ...
Java SPI机制详解.md
总结起来,Java中的MP3 SPI是通过Java Sound API的SPI机制来扩展其对MP3音频格式的支持。`MpegAudioSPI1.9.5`是一个实现了MP3 SPI的库,它提供了解码和播放MP3文件的功能。通过使用这个库,开发者可以轻松地在Java...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务提供商。这个机制使得开发者可以扩展应用的功能,而无需修改原有代码。SPI的核心概念在于,服务接口由主程序...
“通过java的spi机制内置支持多hadoop版本”这部分涉及到Java的Service Provider Interface (SPI)机制。SPI是Java提供的一种服务发现框架,允许第三方开发者扩展JVM内置的服务。在这个FTP服务器中,SPI被用来识别和...
SPI机制则是一种服务发现机制,它定义在`java.util.ServiceLoader`类中。开发者可以通过在类路径下的META-INF/services目录下创建以服务接口全限定名命名的文本文件,文件内容列出实现了该接口的所有类,然后使用...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载和使用服务提供商。这个机制使得开发者可以扩展应用程序的功能,而不需要修改应用程序的代码。在Java SPI中,...
Java SPI(Service Provider Interface)是Java标准库提供的一种服务发现机制,它允许程序在运行时动态地查找并...`spitest`项目可能是一个用于演示如何使用和配置SPI的示例,可以帮助开发者更好地理解和应用SPI机制。
这个资源是我的博客《java SPI机制学习笔记》中的提供服务的jar包
"深入学习Java中的SPI机制" Java中的SPI(Service Provider Interface)机制是一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。SPI机制的主要思想是将装配的控制权移到程序...
总结,Java SPI机制为开发者提供了一种灵活的服务发现和加载方式,使得软件系统能够更好地适应变化,降低耦合度,增强系统的可扩展性和可维护性。在实际项目中,合理利用SPI可以提高软件组件的可插拔性,方便集成和...
标题中的“一款基于hdfs的ftp服务器,通过java的spi机制内置支持多hadoop版本,自带依赖,无需编译即可使用”揭示了这个项目的核心特点。这是一个FTP(File Transfer Protocol)服务器,它构建在Hadoop分布式文件...
总结,Java SPI机制是Java平台提供的一种强大的可扩展性工具,它使得开发者可以轻松地添加、替换服务实现,而无需修改主程序代码。在实际开发中,如JDBC驱动、JAXP解析器等都广泛使用了SPI。理解并掌握SPI的使用,能...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务实现。这个机制使得开发者可以扩展已存在的应用程序或库,而无需修改原代码。SPI的核心理念是将服务接口与其...