5分钟学会SPI
SPI
- 定义:SPI 是一种机制,允许用户在不修改现有代码的情况下扩展和替换特定服务的实现。它定义了一组接口(Service Interfaces)和一组实现(Service Providers),使得应用程序可以动态加载和使用这些实现。
- 特征
- 接口与实现分离:SPI 定义了一组接口,而具体的实现则由服务提供者提供。这种分离有助于实现代码的灵活性和可维护性。
- 动态加载:通过使用反射和配置文件,应用程序可以在运行时动态加载服务实现。这使得应用程序可以根据不同的需要选择不同的服务提供者。
- 可扩展性:SPI 允许开发者轻松添加新的服务实现而无需修改应用程序的核心代码,增强了系统的可扩展性。
- 模块化设计:SPI 提供了一种模块化的方式来组织代码,使得不同的功能模块可以独立开发和更新。
在SpringBoot中它通过在ClassPath路径下的META-INF/services中查找文件,自动加载文件中所定义的类。这一机制为很多框架扩展提供了可能。自动装配也是用到了这个机制。
应用举例
- 一个典型的应用场就是JDBC,数据库种类有很多,如果每一种数据库都要有自己的一套特殊的API的话是不合理的,对于使用人员也是不方便的,由此JDK就定义了一套JDBC的规范,JDK只定义接口,由不同的数据库厂商自己去做实现,对于操作人员来说操作的是同一套接口
- 图示
其实就是定义接口,服务商去实现,在使用数据库的时候会导入对应jar包,里面其实就是这些接口的具体实现。
还存在一个问题,程序怎么知道接口是由哪些java类实现的呢?
那就是一个约定:在META-INF/service文件下创建接口名的文件,内容就是接口的实现类的全类路径
代码示例
- 定义一个接口
- 创建一个Mysql实现
- 实现接口
- 按照spi规则创建文件以及填充内容
- 创建testSpi项目引入mysql的实现类
- 加载实现打印实现
- 创建一个oracle实现
步骤与mysql的实现是一样的,直接看结果 - 引入oracle包
- 查看结果