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

本文共 1647 字,大约阅读时间需要 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
serviceLoader = ServiceLoader.load(Search.class);//查找spi的实现 Iterator
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代码:

转载地址:http://cqnqb.baihongyu.com/

你可能感兴趣的文章
自定义io控制码_如何使用组件IO创建自定义组件
查看>>
bisquare与lar_哈Lar 通过SMS与PHP进行通讯!
查看>>
bootstrap 选项卡_使Bootstrap选项卡与砌体一起玩
查看>>
如何在Windows 10 Home上安装Docker
查看>>
cdo气候_开发人员可以为气候行动做出贡献的7种方法
查看>>
noops fabric_每个开发公司需要了解的有关NoOps开发的知识
查看>>
如何在WordPress生态系统中找到合适的位置
查看>>
macOS Catalina:Web开发人员和设计师应了解的5件事
查看>>
易辅客栈 从零学辅助_如何从零启动辅助项目
查看>>
webpack指南_Webpack初学者指南
查看>>
使用Socialite轻松向您的应用添加社交登录
查看>>
fa fa-user_如何通过短信通过2FA保护Laravel应用
查看>>
使用MongoDB Stitch在10分钟内构建一个Slack应用
查看>>
next主题seo优化_SEO可见性的5个最佳WordPress主题
查看>>
揭穿3个常见的WordPress神话
查看>>
wordpress 静态化_地理定位WordPress内容以个性化您的网站
查看>>
系统上线发布清单_跨浏览器测试清单上线之前
查看>>
Python自然语言处理入门
查看>>
迁移wordpress_从WordPress.Com迁移到自托管WordPress
查看>>
文档编写软件_编写第一个软件文档的指南
查看>>