# study-java-spi
**Repository Path**: framework-learning-notes/study-java-spi
## Basic Information
- **Project Name**: study-java-spi
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-06-01
- **Last Updated**: 2024-06-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# study-java-spi
#### 介绍
在Java编程中,SPI代表“Service Provider Interface”(服务提供者接口)。SPI机制允许开发人员定义服务接口,
并允许第三方实现这些接口的服务提供者。通过SPI,服务的实现者能够注册其实现,使得系统可以动态地发现和使用这些服务。
#### 实现步骤
1. 定义服务接口
定义顶层组件接口,如:[base-driver](base-driver)模块中的 com.jack.spi.driver.BaseDriver 接口。
在通常的开发中,可以定义一个核心包,专门用来存放顶层设计的接口。将核心功能先抽象出来,实现真正的代码解耦(虽
然还不知道其他的优秀设计模式)
2. 定义组件实现
在要实现的具体组件中,添加顶层接口的依赖包,如:
``` xml
base-driver
com.jack
1.0-SNAPSHOT
```
实现服务接口的具体实现,如:[mysql-driver](mysql-driver)、[oracle-driver](oracle-driver)模块中的
com.jack.spi.driver.impl.MysqlDriverImpl 类,将具体的实现代码放在实现类中。
定义配置文件,在resources目录下,创建META-INF/services目录,并在该目录下创建文件,文件名为服务接口的全限
定名,如 com.jack.spi.driver.BaseDriver,并在文件中写入实现类的全限定名, 如 com.jack.spi.driver.impl.MysqlDriverImpl。
3. 调用顶层接口的实现组件,比如在springboot中引入依赖,并注入具体的实现类,如:
``` xml
com.jack
mysql-driver
1.0-SNAPSHOT
com.jack
oracle-driver
1.0-SNAPSHOT
```
调用顶层接口的实现组件实现类,如:
``` java
@Test
void contextLoads() {
// 从ServiceLoader中加载BaseDriver的实现类
ServiceLoader load = ServiceLoader.load(BaseDriver.class);
for (BaseDriver baseDriver : load) {
// 初始化驱动
baseDriver.init();
// 注册驱动
baseDriver.register();
// 注销驱动
baseDriver.unregister();
// 销毁驱动
baseDriver.destroy();
}
}
```
执行效果:
