文档章节

Java的Service Provider Interface(SPI)

明舞
 明舞
发布于 2015/07/02 15:20
字数 364
阅读 141
收藏 1

SPI是Java 1.5新添加的一个内置标准,允许不同的开发者去实现某个特定的服务。

一个Service就是一套著名的接口或抽象类,而Service Provider是这个Service的一个特定实现类。Service Provider按Service接口分类,同一个Service只能有一个实现类被注册。因为在实际中,Service都是单例的。如果同时注册了多了,后面的Service Provider将覆盖前面注册的Service Provider。

声明一个service provider需要在JAR包的META-INF目录下创建一个service子目录,并且为每一个service provider提供一个以Service全名命名的文件。假如JAR包有一个类com.mycompany.mypkg.MyServiceImpl实现了javax.someapi.SomeService接口,JAR包中应该包含一个文件:

META-INF/services/javax.someapi.SomeService

这个文件中包含一行:

com.mycompany.mypkg.MyService


版权声明:本文为博主原创文章,未经博主允许不得转载。

demo如下:

package spi.test;

public class ChildSPIService implements SPIService {

    @Override
    public void test() {
        // TODO Auto-generated method stub
        System.out.println("test");
    }

}
package spi.test;

public class ChildSPIService2 implements SPIService {

    @Override
    public void test() {
        // TODO Auto-generated method stub
        System.out.println("test2");
    }

}
package spi.test;

public interface SPIService {

    public void test();
}
package spi.test;

import java.util.Iterator;

public class SpiTest {

    /**
     * @param args
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws InstantiationException, IllegalAccessException,
                                          ClassNotFoundException {
        // TODO Auto-generated method stub
        Iterator it = sun.misc.Service.providers(SPIService.class);
        while (it.hasNext()) {
            SPIService service = (SPIService) it.next();
            service.test();
        }
    }
}
package spi.test;

import java.util.ServiceLoader;

public class SpiTest2 {

    /**
     * @param args
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws InstantiationException, IllegalAccessException,
                                          ClassNotFoundException {
        ServiceLoader<SPIService> loader = ServiceLoader.load(SPIService.class);
        for (SPIService service : loader) {
            service.test();
        }

    }
}
spi.test.ChildSPIService2

文件目录结构如下:

© 著作权归作者所有

上一篇: 两篇好文章
明舞
粉丝 230
博文 424
码字总数 516555
作品 0
程序员
私信 提问
Dubbo的SPI实现以及与JDK实现的区别

在 Java 里, 为了规范开发,制定了大量的「规范」与「标准」,这些上层的内容,大多是以接口的形式提供出来。那这些接口最终实现是谁呢,在哪里呢? 规范并不关心这个。 所谓规范,是指定了...

小红牛
2018/06/28
0
0
我是SPI,我让框架更加优雅了!

文章首发于【陈树义的博客】,点击跳转到原文《我是 SPI,我让框架更加优雅了!》 自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作。就在刚刚,小黑又接到一个任...

陈树义
2018/07/16
0
0
Java SPI - Service Provider Interface

Java SPI_Service Provider Interface 我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之...

秋风醉了
2015/12/29
178
0
高级开发必须理解的Java中SPI机制

本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。 一、SPI是什么 SPI全称Service Provider Interface,是Java提供的一套用来...

技术小能手
2018/09/14
0
0
我是 SPI,我让框架更加优雅了!

  自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作。就在刚刚,小黑又接到一个任务:做一个通用的歌曲信息解析框架。即输入歌曲数据,之后返回该歌曲的名称、作...

java进阶架构师
2018/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
18分钟前
2
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
27分钟前
2
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
28分钟前
1
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
33分钟前
3
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部