关于Java SPI的原理和实践

本文介绍了Java SPI(Service Provider Interface)机制,通过一个简单的日志接口实例,详细阐述了如何定义接口、实现接口的加载与调用。通过SPI,接口调用者只需关注接口,实现类的切换和扩展变得更加灵活,降低了耦合。文章还探讨了SPI的加载过程,展示了如何创建服务提供者和测试接口调用。
摘要由CSDN通过智能技术生成

在Java中,我们经常会提到面向接口编程,这样减少了模块之间的耦合,更加灵活。

在一个项目中我们也通常将接口和实现类放在一起,但是如果哪天我们要替换其它的实现类,或者是修改实现类,涉及到实现类的代码也要相应地修改。

能不能这样:在调用服务的时候,我们只调用接口,不用关心实现类呢?无论我们怎么切换实现类,调用接口的部分代码都能正常运行?

当然是可以的,Java SPI (Service Provider Interface)就提供了这样的机制。

Java SPI机制中,我们不再是手动指定接口和实现类的关系,而是让接口去寻找可用的实现类

事实上,我们经常使用的Spring框架、日志接口等等,都是使用了SPI机制实现了扩展。

1,SPIAPI

在说起SPI之前,我们还是先看一下APIAPI我们已经很熟悉了,和SPI都可以被称作接口

只不过API功能的实现,以及接口的定义全部是接口的实现者提供的,调用者只需要调用接口即可:

 

不过SPI就不一样了,在SPI机制中,调用者仍然是调用接口,但是这个接口是独立存在的,并且可以由不同的实现者实现

 

也就是说,这里接口只是一个标准,并且提供接口的那一方并不一定回去实现接口,而是根据接口的定义,由更多的第三方实现。

这个接口可以由一个甚至是多个实现者去实现。也因此,调用者在调用接口时,可能还需要指定一下使用哪个实现者的实现类

实现者也叫做服务提供者

事实上,我们日常生活中经常使用的U盘也很类似SPI机制,U盘使用的是USB接口,USB接口仅仅是一个规范(接口),但是发明USB接口的公司并没有去生产U盘,而是由不同的U盘厂商例如金士顿、闪迪(实现者)等等去根据这个规范生产U盘,然后我们就可以去选择自己喜欢的牌子(选择实现者)购买U盘,不过平时无论使用什么牌子的U盘,我们只需要插入到电脑的USB接口(调用接口&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值