Dubbo SPI实战

news/2023/6/9 18:58:09

Dubbo SPI实战

1. SPI 概述

在具体分析之前还是先了解下 SPI 是什么?

首先它其实是 Service provider interface 的简写,翻译成中文就是服务提供发现接口。

不过这里不要被这个名词搞混了,这里的服务发现和我们常听到的微服务中的服务发现并不能划等号。

就如同对一个接口的多种实现方式 A、B、C(可以把它们理解为服务),我需要在运行时知道应该使用哪一种具体的实现。

其实本质上来说这就是一种典型的面向接口编程,这一点在我们刚开始学习编程的时候就被反复强调了。

2. SPI 实践

接下来看一个例子,是如何实现SPI的。

定义接口

既然刚才都提到了 SPI 的本质就是面向接口编程,所以自然我们需要定义一个接口: BeanFactory

在这里插入图片描述

为了让其他人也能实现自己的 BeanFactory,所以我们将这个接口单独放到一个 Module: spi-beanfactory中,可供他人引入实现。
在这里插入图片描述

实现接口

新建一个 Module:spi-mybeanfactory

在这里插入图片描述

通过maven引入刚才的模块

  <dependency><groupId>org.example</groupId><artifactId>spi-beanfactory</artifactId><version>1.0.0</version></dependency>

实现 BeanFactory

在这里插入图片描述

在 resources 目录下新建一个 META-INF/services/com.lg.benfactory.BeanFactory 文件

注意文件名必须得是我们之前定义接口的全限定名(SPI 规范)。

其中的内容便是我们自己实现类的全限定名,如下:

  com.lg.mybeanfactory.MyBeanFactory

可以想象最终会通过这里的全限定名来反射创建对象。

当 classpath 中存在我们刚才的实现类(引入实现类的 jar 包),便可以通过 java.util.ServiceLoader 工具类来找到所有的实现类(可以有多个实现类同时存在,只不过通常我们只需要一个)。

我们只需要引入这个依赖便能使用它的实现,当我们想换一种实现方式时只需要更换一个依赖即可。

测试

public class App {public static void main( String[] args ) throws Exception {ServiceLoader<BeanFactory> factories = ServiceLoader.load(BeanFactory.class);for (BeanFactory factory : factories) {factory.getBean("");}}
}

最后输出的结果如下:

在这里插入图片描述

3. SPI 的优缺点

优点

使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。

缺点

虽然ServiceLoader也算是使用的延迟加载,但是基本只能通过遍历全部获取,也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。获取某个实现类的方式不够灵活,只能通过Iterator形式获取,不能根据某个参数来获取对应的实现类。

多个并发多线程使用ServiceLoader类的实例是不安全的。

4. 鸣谢

高级开发必须理解的Java中SPI机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4563608.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

分析与处理音乐信号

音乐信号中的基础概念 我们先来看看音乐信号中的一些基础概念。这里主要介绍一下常见乐器的发音原理,什么是速度和节拍,以及什么是音调和调式。 常见的乐器种类和发音原理 你还记得语音信号分析中,人的发音原理吗?音乐信号中除了人声歌唱的部分外,主要是乐器的声音,那…

史上最强物理学科普!技术小白都能看懂哦!

本文素材主要摘录自加来道雄的《Hypersapce》和丘成桐的《The Shape of Inner Space》。作者希望凭籍本文&#xff0c;回顾一下两百年来的科学史&#xff0c;看看那些代表着人类最高心智的数学家、物理学家们前仆后继探究宇宙本源的奇妙历程&#xff0c;并向他们致以最崇高的敬…

1月13日 :大饼上涨暂时告一段落,中途休息中

一波小上涨完美跟上&#xff0c;可惜错过了最佳的出场位置&#xff0c;让人很难受&#xff0c;不过话说回来&#xff0c;留得青山在不怕没柴烧&#xff0c;我现在不怕踏空&#xff0c;就怕一激动脑袋一热又冲进去出现大幅亏损&#xff0c;当然我也希望读文章的你一样&#xff0…

C++基本告一段落

c基本告一段落。 继承&#xff0c;多态。 下午考试加油咯。

【基本功】深入剖析Swift性能优化

简介 2014年&#xff0c;苹果公司在WWDC上发布Swift这一新的编程语言。经过几年的发展&#xff0c;Swift已经成为iOS开发语言的“中流砥柱”&#xff0c;Swift提供了非常灵活的高级别特性&#xff0c;例如协议、闭包、泛型等&#xff0c;并且Swift还进一步开发了强大的SIL&…

浪潮之巅第十三章 — 高科技公司的摇篮:斯坦福大学

转自&#xff1a;http://www.google.com.hk/ggblog/googlechinablog/2009/01/blog-post_9073.html 硅谷的兴起很大程度上是靠斯坦福大学多方位的支持。很多当今世界上 IT 领域的领头公司都是由斯坦福大学的学生和教授创办的。它们包括惠普公司、思科公司、太阳公司、雅虎公司、…

java求美国数学家的年龄_陶哲轩8岁在美国高考得760分,智商超爱因斯坦30%,现状如何了?...

陶哲轩&#xff0c;8岁参加美国高考&#xff0c;这已经令人震惊&#xff1b;但更加让人意想不到的是&#xff0c;满分800分的试卷&#xff0c;8岁的他就斩获了760分&#xff0c;这简直太不可思议了&#xff01;智商超群的陶哲轩&#xff0c;是众人口中的"小神童"&…