|
|
1 miesiąc temu | |
|---|---|---|
| gradle | 1 miesiąc temu | |
| simple-api | 1 miesiąc temu | |
| simple-company | 1 miesiąc temu | |
| simple-isp-moblie | 1 miesiąc temu | |
| simple-isp-unicom | 1 miesiąc temu | |
| .gitignore | 1 miesiąc temu | |
| build.gradle | 1 miesiąc temu | |
| gradlew | 1 miesiąc temu | |
| gradlew.bat | 1 miesiąc temu | |
| readme.md | 1 miesiąc temu | |
| settings.gradle | 1 miesiąc temu |
Service Provider Interface
java1.6引入的,基于ClassLoader的发现并加载服务的机制
JDBC技术典型的SPI实践案例,JDK通过Service接口,具体的数据库厂商负责具体的Service Provider实现
配置文件规范
e.g
在MySQL的驱动jar中的META-INF/services目录中有一个"java.sql.Driver"文件,文件内容为"com.mysql.cj.jdbc.Driver"
Service Provide类必须具备无参的构造方法
保证能加载到配置文件和Service
一个公司A,需要连接互联网.公司A定义连接网络的API(Service),由中国移动(Service Provider)和中国联通(Serivce Provider)负责提供具体的网络连接服务
SPI实现流程
- 在service定义接口
- 在service provider中实现service,并在META-INF/services目录下提供对应的配置文件
- 在应用程序中使用ServiceLoader加载service,然后进行使用
定义service接口
在模块Simple-api中定义网络的连接接口
package space.anyi;
/**
* @ProjectName: SPI-learn
* @FileName: InternetService
* @Author: 杨逸
* @Data:2025/10/13 11:13
* @Description: 网络服务接口
*/
public interface InternetService {
void connect();
}
模块simple-isp-moblie
模块simple-isp-moblie引入simple-api依赖
plugins {
id 'java'
}
group 'space.anyi'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
//引入simple-api依赖,以项目的形式
implementation(project(":simple-api"))
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}
模块simple-isp-moblie实现service
package space.anyi;
/**
* @ProjectName: SPI-learn
* @FileName: MoblieInternetService
* @Author: 杨逸
* @Data:2025/10/13 11:24
* @Description: 中国移动提供的网络服务实现
*/
public class MoblieInternetService implements InternetService{
@Override
public void connect() {
System.out.println("使用中国移动提供的网络服务");
}
}
在"META-INF/services"目录下提供"space.anyi.InternetService"配置文件
space.anyi.MoblieInternetService
模块simple-isp-unicom引入simple-api依赖
plugins {
id 'java'
}
group 'space.anyi'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
//引入simple-api依赖,以项目的形式
implementation(project(":simple-api"))
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}
模块simple-isp-unicom实现service
package space.anyi;
/**
* @ProjectName: SPI-learn
* @FileName: UnicomInternetService
* @Author: 杨逸
* @Data:2025/10/13 11:37
* @Description: 中国联通提供的网络服务实现
*/
public class UnicomInternetService implements InternetService{
@Override
public void connect() {
System.out.println("使用中国联通提供的网络服务");
}
}
在"META-INF/services"目录下提供"space.anyi.InternetService"配置文件
space.anyi.UnicomInternetService
模块simple-compnay引入依赖
plugins {
id 'java'
}
group 'space.anyi'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
//可以全都使用,也可以按需使用
//服务提供,使用中国移动的网络服务
implementation(project(":simple-isp-moblie"))
//服务提供,使用中国联通的网络服务
implementation(project(":simple-isp-unicom"))
//接口依赖
implementation(project(":simple-api"))
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}
使用加载Service并使用
package space.anyi;
import java.util.ServiceLoader;
/**
* @ProjectName: SPI-learn
* @FileName: CompanyApplication
* @Author: 杨逸
* @Data:2025/10/13 11:45
* @Description: 公司A连接互联网的应用
*/
public class CompanyApplication {
public static void main(String[] args) {
//通过java.util.ServiceLoader加载服务
ServiceLoader<InternetService> services = ServiceLoader.load(InternetService.class);
//遍历服务
for (InternetService service : services) {
//使用服务
service.connect();
}
}
}
运行项目实现开箱即用的效果