很多主流框架都用到了SPI机制,比如Dubbo、Spring都有用到,可能很多小伙伴也听说过。今天给大家来聊一聊什么是SPI,它用什么作用?
另外,我花了很长时间,准备了一份500页的PDF面试资料文档和一份10W字的Java面试题和答案,想获取的小伙伴可以
↓ ↓ ↓
扫描下方二维码联系我领取!
1、什么是SPI
SPI全称Service Provider Interface,它是Java提供的一套用来被第三方实现或者扩展的API。
ENTER TITLE
如图所示,简单来说,就是我们定义一个标准的接口,然后第三方的库里面可以实现这个接口。
那么,程序在运行的时候,会根据配置信息动态加载第三方实现的类,从而完成功能动态扩展的机制。
2、SPI的应用场景
SPI的主要作用是解耦。适用于调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。
在Java中,SPI机制有一个非常典型的实现案例,就是数据库驱动java.jdbc.Driver
ENTER TITLE
如图所示,JDK里面定义了数据库驱动类Driver,它是一个接口,JDK并没有提供实现,具体的实现是由第三方数据库厂商来完成的。
在程序运行的时候,会根据我们声明的驱动类型,来动态加载对应的扩展实现,从而完成数据库的连接。
ENTER TITLE
除此之外,在很多开源框架里面都借鉴了Java SPI的思想,提供了自己的SPI框架,比如Dubbo定义了ExtensionLoader,实现功能的扩展。
Spring提供了SpringFactoriesLoader,实现外部功能的集成,基于Servlet 3.0规范对ServletContainerInitializer的实现。
Java中SPI的设计主要用到了桥接模式,在实际开发中,借鉴这种思想可以在不修改核心代码的情况下,完成提供功能的增强和扩展,而且不需要显式地依赖于继承或者接口。以上就是我对Java SPI的理解。
我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指一键三连分享给更多的人。关注我,面试不再难! /