博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java SPI机制原理和使用场景
阅读量:5045 次
发布时间:2019-06-12

本文共 1661 字,大约阅读时间需要 5 分钟。

SPI的全名为Service Provider Interface.这个是针对厂商或者插件的。一般来说对于未知的实现或者对扩展开放的系统,通常会把一些东西抽象出来,抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。这个可以通过我们的抽象工厂方法来理解这个含义,实现是可以又厂商或者开发人员自己实现。由于代码上是处于上层的一个封装者,是不会知道底层怎么去实现,那么只能通过spi的形式,让上层知道应该调用哪个抽象的具体实现。所以这里可以理解为某些jar包里,为其他开发扩展调用使用的一种方式,可以为某个接口或服务,提供一个具体的实现。

主要用到ServiceLoader这个类,ServiceLoader通过读取resources/META-INF/services/com.xxx.xxx.xxxService文件下的xxxService的spi实现类,通过反射获取对应类实例,并调用对应方法。

public class SearchFactory {

private SearchFactory() {
}
public static Search newSearch() {
Search search = null;
ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);//查找spi的实现
Iterator<Search> searchs = serviceLoader.iterator();
if (searchs.hasNext()) {
search = searchs.next();
}
if (search == null) {//如果没有spi实现,就是用默认的类对象实现
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
search = (Search) classLoader.loadClass(Search.defaultSearchClass).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return search;
}
}
使用场景有:

1、javax.xml.ws.spi.Provider,这个类可以使用另外的实现,如com.sun.xml.internal.ws.spi.ProviderImpl。

这里需要在工程下的resources目录,建一个META-INF/services目录,然后创建一个文件名为javax.xml.ws.spi.Provider,文件内容为com.sun.xml.internal.ws.spi.ProviderImpl。如果对于spi没有默认实现的,那么将会报错,这里就需要按照以上格式进行添加。

 

关于spi的更多了解,大家可以查看我写的一个简单的代码,非常简单。多谢大家支持!

github代码:https://github.com/zhuzhenke/java-spi-test

---------------------
作者:codingtu
来源:CSDN
原文:https://blog.csdn.net/codingtu/article/details/79004657
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/GarfieldEr007/p/10201786.html

你可能感兴趣的文章
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>
动态调用WCF服务
查看>>
oracle导出/导入 expdp/impdp
查看>>
类指针
查看>>
css修改滚动条样式
查看>>
2018.11.15 Nginx服务器的使用
查看>>
Kinect人机交互开发实践
查看>>
百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET...
查看>>
JAVA 技术类分享(二)
查看>>
android客户端向服务器发送请求中文乱码的问
查看>>
Symfony翻译教程已开课
查看>>
TensorFlow2.0矩阵与向量的加减乘
查看>>
NOIP 2010题解
查看>>
javascript中的each遍历
查看>>
String中各方法多数情况下返回新的String对象
查看>>
浅谈tcp粘包问题
查看>>