一个服务(service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按spi标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名。如有一个服务接口com.test.Service,其服务实现类为com.test.ChildService,那此时需要在META-INF/services中放置文件com.test.Service,其中的内容就为该实现类的全限定名com.test.ChildService,有多个服务实现,每一行写一个服务实现,#后面的内容为注释,并且该文件只能够是以UTF-8编码。
这种实现方式,感觉和我们通常的开发方式差不多,都是定义一个接口,然后子类实现父类中定义的方法,为什么要搞这么一套标准以及单独搞一个配置文件?这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准,举个简单的例子,如现在的JDK中有支持音乐播放,假设只支持mp3的播放,有些厂商想在这个基础之上支持mp4的播放,有的想支持mp5,而这些厂商都是第三方厂商,如果没有提供SPI这种实现标准,那就只有修改JAVA的源代码了,那这个弊端也是显而易见的,也就是不能够随着JDK的升级而升级现在的应用了,而有了SPI标准,SUN公司只需要提供一个播放接口,在实现播放的功能上通过ServiceLoad的方式加载服务,那么第三方只需要实现这个播放接口,再按SPI标准进行打包成jar,再放到classpath下面就OK了,没有一点代码的侵入性。
这种实现方式,感觉和我们通常的开发方式差不多,都是定义一个接口,然后子类实现父类中定义的方法,为什么要搞这么一套标准以及单独搞一个配置文件?这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准,举个简单的例子,如现在的JDK中有支持音乐播放,假设只支持mp3的播放,有些厂商想在这个基础之上支持mp4的播放,有的想支持mp5,而这些厂商都是第三方厂商,如果没有提供SPI这种实现标准,那就只有修改JAVA的源代码了,那这个弊端也是显而易见的,也就是不能够随着JDK的升级而升级现在的应用了,而有了SPI标准,SUN公司只需要提供一个播放接口,在实现播放的功能上通过ServiceLoad的方式加载服务,那么第三方只需要实现这个播放接口,再按SPI标准进行打包成jar,再放到classpath下面就OK了,没有一点代码的侵入性。
如xml-parse等都属于spi,我自己实践了一下,示例如下:
定义接口
package spi; /** * Service Provider Interface * META-INF\service\$interface full name * 内容为借口实现类全名 * @author liwenj */ public interface Developer { public String getPrograme(); }
实现接口
package spi; public class JavaDeveloper implements Developer { @Override public String getPrograme() { return "Java"; } }
实现接口的同时,需要在MANIFEST中声明实现
在META-INF\service目录下 创建文件,以接口全名为名,如"spi.Developer"
内容就是实现类的全名,可以存在多个
注意:在META-INF\service中声明好接口实现后,要打成一个jar包导入到工程的classpath中。jdk需要在Jar文件中的META-INF\service目录中搜索
使用实现
package spi; import java.util.ServiceLoader; public class DeveloperClient { public ServiceLoader<Developer> serviceloader = ServiceLoader.load(Developer.class); public static void main(String[] arg) { DeveloperClient devClient = new DeveloperClient(); Developer dev = devClient.getDeveloper(); System.out.println(dev.getPrograme()); } private Developer getDeveloper(){ Developer lastdev = null; for(Developer dev : serviceloader) { System.out.println("out." + dev.getPrograme()); lastdev = dev; } return lastdev; } }
相关推荐
SPI,全称Service Provider Interface,是Java平台提供的一种服务发现和动态加载的机制。它允许JVM在运行时动态地查找并加载实现特定接口的服务提供商。这种机制在Java生态系统中广泛应用,比如数据库驱动、日志框架...
Java SPI(Service Provider Interface)是Java提供的一种服务发现机制,允许第三方开发者为已存在的接口提供实现。通过SPI,系统能够动态地找到并加载实现指定接口的服务。本文将深入讲解SPI的概念、实现步骤、常见...
SPI(Service Provider Interface)是一种服务发现机制,允许程序在运行时查找并加载实现特定接口的服务提供者。这种机制广泛应用于Java环境中,其核心是利用`java.util.ServiceLoader`类来查找并实例化服务实现。 ...
在Java平台上,Service Provider Interface (SPI) 是一种允许第三方开发者扩展Java应用程序的机制。它使得开发者可以为已存在的服务提供自定义实现,而无需修改原始的代码。在Java的类库中,许多接口都利用了SPI,...
spi(Service Prodiver Interface) ###前提概述 在面向对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可插拔的原则。再者硬编码的不好这处还...
ServiceLoader是一个用于动态发现服务提供者(如SPI,Service Provider Interface)的工具,它使得组件的加载和使用更加灵活。 10. **反射增强** 在JDK1.5中,反射API得到增强,增加了对泛型的支持,可以获取到...
1. **加密服务提供者**:JCE通过服务提供者接口(Service Provider Interface, SPI)来引入不同的加密实现。开发者可以选择不同的服务提供者,如SunJCE(Sun的JCE实现)或其他第三方提供者。 2. **加密算法**:JCE...
6. **org.graalvm.compiler.serviceprovider.processor**: 这可能是GraalVM服务提供者接口的处理器代码,用于处理和注册Java SPI(Service Provider Interface)。 7. **org.graalvm.compiler.loop**: 这部分可能...
Dubbo SPI(Service Provider Interface)是阿里巴巴开源的Java服务发现框架,它允许开发者在运行时动态地查找和加载服务提供者。SPI机制是基于Java的ServiceLoader类实现的,是Java标准扩展的一种方式,用于解耦...
SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,全称为Java标准扩展服务提供者接口。它允许Java应用程序在运行时动态地发现和加载服务实现。SPI的设计初衷是为了提高软件组件之间的解耦,使得...
**JDK SPI(Service Provider Interface)详解** Java的Service Provider Interface (SPI) 是一个用于实现动态服务发现和加载的机制,它允许Java应用程序在运行时查找并使用由第三方提供的服务。SPI是Java标准库中...
- **服务提供者接口(Service Provider Interface, SPI)**: 模块化系统改进了SPI,使得服务提供者注册更易于管理。 **2. 多版本JAR编译(JEP 238: Multi-Release JAR Files)** 多版本JAR文件允许一个JAR包含针对...
在Dubbo中,Service Provider Interface (SPI) 是其核心的可扩展机制,它使得用户可以根据自己的需求自定义实现特定的功能,如协议、序列化、注册中心等。本文将深入探讨Dubbo的SPI源码,从理论到实践,揭示其设计...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载和使用服务提供商。这个机制使得开发者可以扩展应用程序的功能,而不需要修改应用程序的代码。在Java SPI中,...
Service Provider Interface(SPI)是Java提供的一种机制,允许第三方开发者扩展JDK的功能。在Arquillian Core SPI中,这种机制被用来构建可插拔的测试平台,开发者可以定义自己的适配器来支持不同的容器和测试环境...
Dubbo SPI(Service Provider Interface)是阿里巴巴开源的Dubbo框架中的一个重要特性,它提供了一种动态发现服务提供者和加载实现类的机制,使得服务消费者无需关心服务提供者的具体实现,增强了系统的可扩展性和...
这对于设计服务提供者框架(如SPI,Service Provider Interface)非常有用。 在并发编程方面,Java 8提供了Fork/Join框架和Parallel Streams,用于高效地执行并行任务。Fork/Join框架基于工作窃取算法,能够将大...
JAVA SPI(Service Provider Interface)是一种服务发现机制,内置在JDK中。它提供了一种灵活的方式来发现和加载服务提供者。SPI机制允许开发者编写一个接口,多个实现,通过配置文件来指定要加载的实现类。这种机制...
例如,使用`com.sun.media.jai.imageio.ImageIOStream`类可以读取DICOM文件,`com.sun.media.jai.imageioimpl.plugins.dcm.DicomImageReaderSpi`则提供了读取DICOM文件的Service Provider Interface (SPI)。...