5分钟学会SPI

SPI

  • 定义SPI 是一种机制,允许用户在不修改现有代码的情况下扩展和替换特定服务的实现。它定义了一组接口(Service Interfaces)和一组实现(Service Providers),使得应用程序可以动态加载和使用这些实现。
  • 特征
    • 接口与实现分离:SPI 定义了一组接口,而具体的实现则由服务提供者提供。这种分离有助于实现代码的灵活性和可维护性。
    • 动态加载:通过使用反射和配置文件,应用程序可以在运行时动态加载服务实现。这使得应用程序可以根据不同的需要选择不同的服务提供者。
    • 可扩展性:SPI 允许开发者轻松添加新的服务实现而无需修改应用程序的核心代码,增强了系统的可扩展性。
    • 模块化设计:SPI 提供了一种模块化的方式来组织代码,使得不同的功能模块可以独立开发和更新。

在SpringBoot中它通过在ClassPath路径下的META-INF/services中查找文件,自动加载文件中所定义的类。这一机制为很多框架扩展提供了可能。自动装配也是用到了这个机制。

应用举例

  • 一个典型的应用场就是JDBC,数据库种类有很多,如果每一种数据库都要有自己的一套特殊的API的话是不合理的,对于使用人员也是不方便的,由此JDK就定义了一套JDBC的规范,JDK只定义接口,由不同的数据库厂商自己去做实现,对于操作人员来说操作的是同一套接口
  • 图示
    在这里插入图片描述

jdk的接口定义
jdk的接口定义
其实就是定义接口,服务商去实现,在使用数据库的时候会导入对应jar包,里面其实就是这些接口的具体实现。
还存在一个问题,程序怎么知道接口是由哪些java类实现的呢?
那就是一个约定:在META-INF/service文件下创建接口名的文件,内容就是接口的实现类的全类路径

代码示例

  • 定义一个接口
    基础接口
  • 创建一个Mysql实现
    引入接口包
  • 实现接口
    实现接口
  • 按照spi规则创建文件以及填充内容
    按照spi规则创建文件以及描述信息
  • 创建testSpi项目引入mysql的实现类
    引入mysql的实现
  • 加载实现打印实现
    实现打印结果
  • 创建一个oracle实现
    步骤与mysql的实现是一样的,直接看结果
  • 引入oracle包
    引入oracle包
  • 查看结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值