# 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(); } } ``` 执行效果: ![img.png](img.png)