SPI(Service Provider Interface) , 是JDK内置的一种服务提供发现机制,为某个接口寻找服务的机制,类似IOC思想,将装配的控制权交给ServiceLoader,可以动态加载接口实现类。
SPI只提供服务接口,具体服务由其他组件实现,接口和具体实现分离(类似桥接),同时能够通过系统的ServiceLoader
拿到这些实现类的集合,统一处理,这样在组件化中往往会带来很多便利,SPI机制可以实现不同模块之间方便的面向接口编程,拒绝了硬编码的方式,解耦效果很好。
package com.aysaml.dubbo.spi.service;
/**
* SPI示例服务接口
*
* @author aysaml
* @date 2019-10-18
*/
public interface SpiDemoService {
/**
* hello示例
*
* @param name
* @return
*/
String hello(String name);
}
package com.aysaml.dubbo.spi.service.impl;
import com.aysaml.dubbo.spi.service.SpiDemoService;
/**
* SPI示例服务实现
*
* @author aysaml
* @date 2019-10-18
*/
public class SpiDemoServiceImpl implements SpiDemoService {
@Override
public String hello(String name) {
System.out.println("hello " + name);
return "hello " + name;
}
}
# 实现
com.aysaml.dubbo.spi.service.impl.SpiDemoServiceImpl
package com.aysaml.dubbo.spi.test;
import com.aysaml.dubbo.spi.service.SpiDemoService;
import java.util.Iterator;
import java.util.ServiceLoader;
/**
* SPI测试
*
* @author aysaml
* @date 2019-10-18
*/
public class SpiTest {
public static void main(String[] args) {
ServiceLoader<SpiDemoService> services = ServiceLoader.load(SpiDemoService.class);
Iterator<SpiDemoService> iterator = services.iterator();
if(null != iterator && iterator.hasNext()){
SpiDemoService spiDemoService = iterator.next();
spiDemoService.hello("SPI");
}
}
}
代码github地址>>>戳这里