Java SPI (Service Provider Interface) 和 Spring SPI 是Java中的服务提供机制,它们允许第三方为某个接口提供实现。
Java SPI 主要应用于库之间的解耦。库的设计者可以定义好接口,并且允许用户通过实现该接口并将JAR文件中的META-INF/services
目录下的配置文件指定为接口的全限定名,文件内容为实现类的全限定名。Java通过ServiceLoader类加载这些实现。
Spring SPI 是Spring框架内部使用的一种机制,主要用于Spring内部扩展,如扩展IoC容器的功能、扩展Bean的后置处理器等。Spring SPI 的配置文件通常在META-INF/spring.factories
,文件内容为key-value形式,key为接口的全限定名,value为实现类的全限定名,多个实现类用逗号隔开。Spring框架通过SpringFactoriesLoader
类加载这些实现。
以下是一个简单的Java SPI和Spring SPI的示例:
Java SPI示例:
- 定义一个接口:
public interface MyService {
void execute();
}
- 实现该接口:
public class MyServiceImpl implements MyService {
@Override
public void execute() {
System.out.println("MyServiceImpl executed.");
}
}
- 在JAR包的
META-INF/services
目录下创建文件,文件名为接口的全限定名:
com.example.MyService = com.example.MyServiceImpl
- 使用ServiceLoader加载实现:
Iterator<MyService> providers = Service.load(MyService.class).iterator();
while (providers.hasNext()) {
MyService service = providers.next();
service.execute();
}
Spring SPI示例:
- 实现Spring的接口:
public class MyBeanPostProcessor implements BeanPostProcessor {
// BeanPostProcessor的实现
}
- 在JAR包的
META-INF/spring.factories
文件中添加配置:
org.springframework.context.beans.factory.config.BeanPostProcessor = com.example.MyBeanPostProcessor
- 在Spring应用中,Spring会自动加载并应用这些扩展点。
这些示例展示了如何定义接口、实现接口、配置实现,以及如何通过Java SPI和Spring SPI加载和使用这些实现。