Java SPI 服务发现
一、SPI概述
Java SPI提供了一种机制:为某个接口寻找服务实现的机制。
调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。
二、使用Java SPI
使用Java SPI,需要遵守如下约定:
- 1、当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;
- 2、接口实现类所在的jar包放在主程序的classpath中;
- 3、主程序通过java.util.ServiceLoder动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;
- 4、SPI的实现类必须携带一个不带参数的构造方法;
三、JAVA SPI示例
创建一个接口:
package com.hef.service;
public interface OrderService {
void seeOrder();
}
创建两个接口的实现:
package com.hef.service.impl;
import com.hef.service.OrderService;
/**
* @Date 2022/1/19
* @Author lifei
*/
public class AppleOrderService implements OrderService {
@Override
public void seeOrder() {
System.out.println("apple order...");
}
}
package com.hef.service.impl;
import com.hef.service.OrderService;
/**
* @Date 2022/1/19
* @Author lifei
*/
public class OrigineOrderService implements OrderService {
@Override
public void seeOrder() {
System.out.println("origine order...");
}
}
创建文件src/main/resources/META-INF/services/com.hef.service.OrderService
,里面内容为:
com.hef.service.impl.AppleOrderService
com.hef.service.impl.OrigineOrderService
服务发现演示:
package com.hef;
import com.hef.service.OrderService;
import java.util.ServiceLoader;
/**
* @Date 2022/1/19
* @Author lifei
*/
public class OrderMain {
public static void main(String[] args) {
ServiceLoader<OrderService> load = ServiceLoader.load(OrderService.class);
for (OrderService orderService : load) {
orderService.seeOrder();
}
}
}
/*
运行上面的程序,打印如下内容:
apple order...
origine order...
*/