# java-spi-demo
**Repository Path**: liukunc9/java-spi-demo
## Basic Information
- **Project Name**: java-spi-demo
- **Description**: java spi示例项目
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-04-24
- **Last Updated**: 2022-04-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# java-spi
## 实现方式
- 1、在spi-operate-service模块中定义接口
```java
package org.lewis.service;
public interface NumOperate {
int exec(int num1, int num2);
}
```
- 2、在spi-operate-add模块中实现接口
- 2.1、实现接口
```java
public class NumAddOperate implements NumOperate {
@Override
public int exec(int num1, int num2) {
return num1 + num2;
}
}
```
- 2.2、在src/main/resources 中新增 META-INF/services 目录,
并且新增一个文件,文件名为第1步接口的全路径名(即org.lewis.service.NumOperate),
文件内容如下:
```text
org.lewis.service.impl.NumAddOperate
```
- 3、在spi-operate-multiplication模块中实现接口
> 这里的步骤和第2步一样,不再赘述
- 4、消费,在spi-operate-consumer中使用服务
- 4.1、在pom中引入接口的依赖,并引入自己想要的服务提供者以来
如:
```xml
org.lewis
spi-operate-service
org.lewis
spi-operate-multiplication
```
- 4.2、通过java.util.ServiceLoader使用
```java
public class App {
public static void main(String[] args) {
ServiceLoader loader = ServiceLoader.load(NumOperate.class);
Iterator iterator = loader.iterator();
if (iterator.hasNext()) {
NumOperate numOperate = iterator.next();
System.out.println(numOperate.exec(1, 2));
} else {
throw new RuntimeException("classpath 中未找到服务org.lewis.service.NumOperate实现类");
}
}
}
```