一个服务(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了,没有一点代码的侵入性。
以下是找到的几篇文章:
1、http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html,这个是官方的文档,有对service的详细介绍,包括规范以及一个简单的示例,这个是学习SPI必须看的文档;
注:http://docs.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider,这个是1.4中对Service Provider的介绍,加载服务是通过sun.misc.Service进行加载的,这个也有相应的示例,照做就OK;
2、Java的SPI机制:http://www.2cto.com/kf/201012/79868.html,这个是国人写的一篇示例文章,也挺不错,里面也有一个简单的示例;
3、Developing a Service Provider using Java API(Service Provider Interface):http://blog.csdn.net/fenglibing/article/details/7083526,这篇文章是转的alexa发表在blogspot上面的,也是一个开发SPI的示例,有兴趣的也可以看看;
4、Add Mp3 capabilities to Java Sound with SPI:http://www.javaworld.com/javaworld/jw-11-2000/jw-1103-mp3.html,这是一个比较老的例子,基于jdk1.3的,因为在jdk1.3的时候还没有支持mp3格式,只支持AU, AIF, MIDI, and WAV等格式,也是一个值得参考的示例。
分享到:
相关推荐
Winsock Service Provider Interface (SPI) 是Windows操作系统中的一个关键组件,它允许第三方开发者创建自定义的网络通信协议或服务提供者。SPI 提供了一个接口,通过这个接口,开发者可以扩展 Winsock 库的功能,...
在Java平台上,Service Provider Interface (SPI) 是一种允许第三方开发者扩展Java应用程序的机制。它使得开发者可以为已存在的服务提供自定义实现,而无需修改原始的代码。在Java的类库中,许多接口都利用了SPI,...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载和使用服务提供商。SPI机制使得开发者可以扩展程序的功能,而无需修改原代码,极大地提高了软件的可扩展性和模块...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务提供商。这个机制使得开发者可以扩展应用的功能,而无需修改原有代码。SPI的核心概念在于,服务接口由主程序...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务实现。这个机制使得开发者可以扩展已存在的应用程序或库,而无需修改原代码。SPI的核心理念是将服务接口与其...
Java MP3SPI,全称Java Media Framework (JMF) MP3 Service Provider Interface,是一个用于在Java平台上处理MP3音频文件的扩展库。它基于Java Media Framework (JMF),提供了对MP3格式音频流的支持,使得Java开发者...
SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许应用程序在运行时动态加载和使用服务提供商。这个机制使得开发者可以将核心应用与可插拔的组件分离开来,提高了软件的可扩展性和模块化。 ...
Java平台扩展机制(Service Provider Interface, SPI)是一种允许第三方开发者扩展Java应用程序或库的功能的方式。在Java Sound API中,SPI扮演着关键角色,使得开发者能够添加对不同音频格式的支持,如MP3。MP3 SPI...
Java SPI(Service Provider Interface)是Java标准库提供的一种服务发现机制,它允许程序在运行时动态地查找并加载实现特定接口的服务提供商。SPI的核心概念在于将服务接口与其实现类解耦,使得开发者可以在不修改...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载和使用服务提供商。SPI机制使得开发者可以扩展程序的功能,而无需修改原代码,极大地提高了软件的可扩展性和模块...
SPI(Service Provider Interface)是Java平台提供的一种服务发现与加载机制,它允许应用程序在运行时动态查找并加载实现特定接口的服务提供商。SPI的核心概念在于,服务提供者通过实现指定的接口来表明他们能够提供...
Java SPI(Service Provider Interface)机制是一种服务提供发现机制,能够实现框架的扩展和替换组件,主要被框架的开发人员使用。SPI 机制的核心思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务实现。这种机制使得应用程序能够与多个第三方组件进行交互,而无需在编译时硬编码具体的实现类。SPI机制的...
本资源包“Java_演示示例和游乐场Keycloak扩展提供程序SPI实现等.zip”包含了关于如何在Keycloak中利用Service Provider Interface (SPI)扩展功能的示例和实践。 Keycloak的核心功能是身份验证和授权,它允许开发者...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许第三方开发者为Java应用程序提供扩展服务。Spring Factories则是Spring框架中用于自动配置和服务发现的一种机制,它基于类路径下的...
Java SPI(Service Provider Interface)是一种Java标准机制,允许应用程序在运行时发现和加载服务提供者。Java SPI的主要思想是将服务接口和服务实现分离,使得服务实现可以独立于服务接口开发和部署。 在Java中,...
SPI(Service Provider Interface)是Java平台中的一个标准接口,它允许Java应用程序在运行时动态发现和加载服务提供商。SPI机制是Java设计模式中的策略模式的一种实现,主要用于解耦框架和扩展模块之间的依赖关系,...
用户还可以定义自己的文档格式,并通过 SPI(Service Provider Interface)机制注册到 JPS 中。这允许应用程序更加灵活地处理各种打印数据。 ### 预定义数据格式的 MIME 类型 JPS 支持多种预定义的数据格式,每种...
Java SPI(Service Provider Interface)技术是Java中的一种服务提供接口机制,它允许开发者提供一个接口,而由其他开发者来提供实现。这种机制可以使得应用程序更加灵活和可扩展。 SPI技术的核心是ServiceLoader类...
SPI(Service Provider Interface)是Java平台中的一个重要特性,它允许JVM在运行时动态加载服务实现。通过SPI机制,开发者可以扩展系统功能,而无需修改核心代码。SPI的核心在于服务接口和服务实现的分离,以及通过...