- Java的SPI机制
demo
测试类
public class JavaSPITest {
public static void main(String[] args) {
//创建服务加载器,只能加载所有实现类,不能加载指定实现类,不能做到按需加载
ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
System.out.println("Java SPI");
//创建实现类的实例
serviceLoader.forEach(Robot::say);
}
}
//接口
public interface Robot {
void say();
}
//实现类
public class Bumblebee implements Robot{
@Override
public void say() {
System.out.println("hello i am Bumblebee");
}
}
//实现类
public class OpyimusPrime implements Robot{
@Override
public void say() {
System.out.println("hello i am OpyimusPrime");
}
}
总结
1. 只能加载所有实现类,不能加载指定实现类,不能做到按需加载
2. 创建的配置文件目录src/main/resources/META-INF/services
3. 配置文件名为接口的全类名org.roy.spi.Robot
4. 配置文件每一行都是一个实现类的全类名
- dubbo的SPI机制
demo
测试类
public static void testDubboSPI(){
ExtensionLoader<Robot> extensionLoader = ExtensionLoader.getExtensionLoader(Robot.class);
Robot opyimusPrime = extensionLoader.getExtension("opyimusPrime");
opyimusPrime.say();
Robot bumblebee = extensionLoader.getExtension("bumblebee");
bumblebee.say();
}
总结
1. 好多东西都是约定好的,配置文件的目录是src/main/resources/META-INF/dubbo
2. 配置文件的文件名还是接口的全类名
3. 配置文件是key=value的形式
4. 接口上一定要有注解@SPI