Java SPI
一、什么是SPI
Service Provider Interface,服务发现机制。用于指定实现类用的,dubbo里经常用到(but dubbo的spi跟jdk原生的spi不一样)。
二、应用
利用SPI加载接口实现类。
先定义一个接口
public interface JavaMateJsonHandler {
String toJson(Object obj);
}
在定义一个实现类,这里用fastjson实现一下这个接口
@AutoService(JavaMateJsonHandler.class)
public class JsonHandler implements JavaMateJsonHandler {
public String toJson(Object obj) {
return JSON.toJSONString(obj);
}
}
@AutoService是谷歌的一个包提供的注解,作用是在编译期在resource目录下生成/META-INF/services/接口名 的文件,文件内容是接口的实现类。
当然也可以不用这个注解,直接手动创建这个文件:
resources/META-INF/services/com.haya.mate.core.spi.JavaMateJsonHandler
com.haya.mate.example.spi.JsonHandler
有了这个文件后,就可以用ServiceLoader去加载并实例化实现类了
public class JavaMateJsonService {
private static JavaMateJsonHandler handler = null;
static {
ServiceLoader<JavaMateJsonHandler> loader = ServiceLoader.load(JavaMateJsonHandler.class);
for (JavaMateJsonHandler item : loader) {
handler = item;
break;
}
}
public static String toJson(Object obj) {
return handler.toJson(obj);
}
}
Loading...