欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 14:43:05
...
温故而知新,一年前写过一篇此内容的文章,貌似已经遗失。
Service Provider Iterface (SPI) 和 sun.misc.Service
            
    
    博客分类: javaee javaeeapispi 

一个服务(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();
	}

}
相关标签: javaee api spi