`
lwj0212
  • 浏览: 49645 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK的SPI(Service Provider Interface)实践

SPI 
阅读更多
     一个服务(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了,没有一点代码的侵入性。
如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;
}
}
 
分享到:
评论

相关推荐

    jdk spi机制

    SPI,全称Service Provider Interface,是Java平台提供的一种服务发现和动态加载的机制。它允许JVM在运行时动态地查找并加载实现特定接口的服务提供商。这种机制在Java生态系统中广泛应用,比如数据库驱动、日志框架...

    记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧.doc

    Java SPI(Service Provider Interface)是Java提供的一种服务发现机制,允许第三方开发者为已存在的接口提供实现。通过SPI,系统能够动态地找到并加载实现指定接口的服务。本文将深入讲解SPI的概念、实现步骤、常见...

    1.为什么dubbo要自己设计一套SPI.txt

    SPI(Service Provider Interface)是一种服务发现机制,允许程序在运行时查找并加载实现特定接口的服务提供者。这种机制广泛应用于Java环境中,其核心是利用`java.util.ServiceLoader`类来查找并实例化服务实现。 ...

    Java Service Provider实现

    在Java平台上,Service Provider Interface (SPI) 是一种允许第三方开发者扩展Java应用程序的机制。它使得开发者可以为已存在的服务提供自定义实现,而无需修改原始的代码。在Java的类库中,许多接口都利用了SPI,...

    xmljava系统源码-demo-java-spi:jdkspi(服务提供者接口)的简单演示

    spi(Service Prodiver Interface) ###前提概述 在面向对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可插拔的原则。再者硬编码的不好这处还...

    JDK1.5 64位绿色版

    ServiceLoader是一个用于动态发现服务提供者(如SPI,Service Provider Interface)的工具,它使得组件的加载和使用更加灵活。 10. **反射增强** 在JDK1.5中,反射API得到增强,增加了对泛型的支持,可以获取到...

    JDK8 JCE 支持256位加密

    1. **加密服务提供者**:JCE通过服务提供者接口(Service Provider Interface, SPI)来引入不同的加密实现。开发者可以选择不同的服务提供者,如SunJCE(Sun的JCE实现)或其他第三方提供者。 2. **加密算法**:JCE...

    jdk10源码包

    6. **org.graalvm.compiler.serviceprovider.processor**: 这可能是GraalVM服务提供者接口的处理器代码,用于处理和注册Java SPI(Service Provider Interface)。 7. **org.graalvm.compiler.loop**: 这部分可能...

    dubbo-spiDemo:精神病

    Dubbo SPI(Service Provider Interface)是阿里巴巴开源的Java服务发现框架,它允许开发者在运行时动态地查找和加载服务提供者。SPI机制是基于Java的ServiceLoader类实现的,是Java标准扩展的一种方式,用于解耦...

    shican-spi:参考 dubbo spi

    SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,全称为Java标准扩展服务提供者接口。它允许Java应用程序在运行时动态地发现和加载服务实现。SPI的设计初衷是为了提高软件组件之间的解耦,使得...

    JDK_SPI

    **JDK SPI(Service Provider Interface)详解** Java的Service Provider Interface (SPI) 是一个用于实现动态服务发现和加载的机制,它允许Java应用程序在运行时查找并使用由第三方提供的服务。SPI是Java标准库中...

    jdk9新特性的例子

    - **服务提供者接口(Service Provider Interface, SPI)**: 模块化系统改进了SPI,使得服务提供者注册更易于管理。 **2. 多版本JAR编译(JEP 238: Multi-Release JAR Files)** 多版本JAR文件允许一个JAR包含针对...

    深度解析Dubbo的可扩展机制SPI源码:从理论到实践,打造高效、稳定的分布式服务框架.rar

    在Dubbo中,Service Provider Interface (SPI) 是其核心的可扩展机制,它使得用户可以根据自己的需求自定义实现特定的功能,如协议、序列化、注册中心等。本文将深入探讨Dubbo的SPI源码,从理论到实践,揭示其设计...

    Java SPI Demo

    Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载和使用服务提供商。这个机制使得开发者可以扩展应用程序的功能,而不需要修改应用程序的代码。在Java SPI中,...

    arquillian-core-spi.jar.zip

    Service Provider Interface(SPI)是Java提供的一种机制,允许第三方开发者扩展JDK的功能。在Arquillian Core SPI中,这种机制被用来构建可插拔的测试平台,开发者可以定义自己的适配器来支持不同的容器和测试环境...

    dubbo spi可扩展机制源码解析

    Dubbo SPI(Service Provider Interface)是阿里巴巴开源的Dubbo框架中的一个重要特性,它提供了一种动态发现服务提供者和加载实现类的机制,使得服务消费者无需关心服务提供者的具体实现,增强了系统的可扩展性和...

    java 安装包版本 jdk1.8版本

    这对于设计服务提供者框架(如SPI,Service Provider Interface)非常有用。 在并发编程方面,Java 8提供了Fork/Join框架和Parallel Streams,用于高效地执行并行任务。Fork/Join框架基于工作窃取算法,能够将大...

    JAVA SPI特性及简单应用代码实例

    JAVA SPI(Service Provider Interface)是一种服务发现机制,内置在JDK中。它提供了一种灵活的方式来发现和加载服务提供者。SPI机制允许开发者编写一个接口,多个实现,通过配置文件来指定要加载的实现类。这种机制...

    jai_imageio-1_0_01-lib-windows-i586-jdk.exe.zip

    例如,使用`com.sun.media.jai.imageio.ImageIOStream`类可以读取DICOM文件,`com.sun.media.jai.imageioimpl.plugins.dcm.DicomImageReaderSpi`则提供了读取DICOM文件的Service Provider Interface (SPI)。...

Global site tag (gtag.js) - Google Analytics