`

Service Provider Iterface (SPI) 和 sun.misc.Service

阅读更多
温故而知新,一年前写过一篇此内容的文章,貌似已经遗失。


一个服务(service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按spi标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名。
如果一个接口com.github.yingzhuo.api.SomeService其实现类为com.github.yingzhuo.spi.SomeServiceProvider,
那此时需要在META-INF/services中放置文件com.github.yingzhuo.api.SomeService,其中的内容就为该实现类的全限定名com.github.yingzhuo.spi.SomeServiceProvider,
有多个服务实现,每一行写一个服务实现,#后面的内容为注释,并且该文件只能够是以UTF-8编码。

接口
package com.github.yingzhuo.api;

public interface SomeService {

	public String getMessage();

}

顶层工厂类
package com.github.yingzhuo.api;

import java.util.Iterator;
import sun.misc.Service;

@SuppressWarnings("rawtypes")
public class SomeServiceFactory {

	private SomeServiceFactory() {
	}
	
	public static SomeService getSomeServiceInstance() {
		Iterator it = Service.providers(SomeService.class);
		if (it.hasNext()) {
			return (SomeService) it.next();
		} else {
			return null;
		}
	}
}

实现类
package com.github.yingzhuo.spi;

import com.github.yingzhuo.api.SomeService;

public class SomeServiceProvider implements SomeService {

	public String getMessage() {
		return getClass().getName();
	}

}
分享到:
评论

相关推荐

    PCI-Bus-Power-Management-Interface-Specification-_The Power_pci

    PCI Bus Power Management Iterface Specification Revision 1.1. describes the basic specification requirements for PCI bus.

    scheduled-service:从Windows Task Scheduler运行的简单任务

    创建一个实现Processor Iterface的新类。 在process()函数中添加逻辑。 将流程添加到服务类的流程列表中。 要创建新的Output类型,请实现OutputNode接口。 进程捆绑在Service类中。 执行jar文件时将执行服务列表...

    ImportDemo.7z

    iterface 接口 接口以I开头,后面以单词来重命名。 例如IComputer 接口不允许使用访问修饰符 pulbic private protected 接口不可以使用修饰符 abstract virtual override static 接口不能定义字段和不能定义...

    LibThriftClient:一个简单,轻巧的节俭客户端库,适用于Java,Android等。

    LibThriftClient 一个小,轻便,简单的节俭客户端库,用于java,android等。 谁需要它 人们使用协议,这是RCP的选择。... } ...``` 您可以像这样编写Iterface和JavaBean: public interface MyService

    用友U8+条码管理解决方案及实施指南

    条码技术最早产生在二十世纪二十年代的美国,在1970年Iterface Mechanisms公司开发出“二维码”之后,才有了价格适于销售的二维矩阵条码的打印和识读设备。此后不久,随着LED(发光二极管)、微处理器和激光二极管的...

    DynamicRestClient:动态 REST 客户端

    动态休息客户端 一个简单的 REST 客户端。 使用动力学。... 您可以为这个 api 编写一个客户端,如下所示: // New up... ImpromptuInterface 可以让你做到这一点: // create an iterface to make it place nice againpubl

    matlab频谱分析代码-flexemg_natelec:FlexEMG2020NatureElectronics出版物的代码和数据存储库

    该目录包括'gui'子目录下的图形用户Iterface(在PyQt中开发),以及位于'FlexEMG_21Class_HDC'的固件(FPGA设计和ARM Cortex M3代码)。 数据分析 从“ data_analysis / realtime_data”目录中的实时实验收集的数据...

    sensor.file_restore:改进的文件传感器组件,使您可以阅读最后一行的全部内容

    文件还原 该组件是官方Home ... 然后使用用户iterface设置实体。 注意:旧的手动方法仍然可用。 设置示例 在下面的示例中,设置了传感器和要配置的参数。 sensor : - platform : file_restore unit_of_meas

    UI程序设计项目实训(仅供学习使用,资源为实验报告)

    UI即User Iterface (用户界面)的简称。 UI设计则是指对软件的人机交互,操作逻辑,界面美观的整体设计。好的UI设计不仅让软件变得有个性有品位,还要让软件的操作变得舒适,简单,自由,充分体现软件的定位和特点。 ...

    Gnome Integrated Blog-开源

    gib是一个Gnome用户博客,旨在简化您自己的博客的管理。 该项目包括2个部分: Gnome用户Iterface = pyGtk + libglade 和php博客基于css,php和mysql。 PD:我的英语不好:D

    rggen-sample-testbench

    具有AMBA APB Iterface的DUT 具有AMBA AXI4-Lite接口的DUT 样本测试用例 该测试平台包括三个调用预定义测试序列的示例测试用例。 测试名称 测试顺序 ral_hw_reset_test ral_bit_bash_test ral_access_test ...

    amiws:Asterisk管理接口(AMI)到Web套接字代理

    ami-Asterisk Manager Iterface(AMI)到网络套接字代理介绍amiws是从AMI到WEB的简单代理。 它可以通过AMI(Asterisk Manager界面)连接到一个或多个Asterisk PBX,从AMI流中读取消息并向其发送操作/命令。 解析接收...

    MessageCostCalculator

    费用计算器一种简单的解决方案,用于计算符合给定Iterface的消息的总成本。 有关此实现,请参见TotalCostCalculator 。 该解决方案包含在单元测试项目中,以简化运行,并且可以在TotalCostCalculatorTests中找到测试...

Global site tag (gtag.js) - Google Analytics