一、SPI的理念
SPI——service provider interface
1.肯定要加载配置文件,配置文件里面配置的是一些类(一般是实现类)
2.根据配置文件的key找value,就像spring的自定义标签解析 namespaceuri——namespaceHandler(<context:component-scan base-package="com.lhc"></context:component-scan>)
dubbo也是这样key-value形式
jdk是获取所有然后遍历就比较lowb
二、JDK的SPI机制
1.定义一个接口UserService三个实现类
2.在resources下建立文件夹META-INF/services,
并在文件夹建文件 com.test.mock.service.UserService里面的内容是三个实现类的全类名
3.serviceLoader获取所有实现类调用
ServiceLoader<UserService> serviceLoader = ServiceLoader.load(UserService.class);
for (UserService userService:serviceLoader){
userService.test1();
}
三、Dubbo的SPI机制
1.定义一个接口UserService三个实现类
2.在resources下建立文件夹META-INF/dubbo,
并在文件夹建文件 com.test.mock.service.UserService里面的内容是三个实现类的全类名
3.ExtensionLoader获取指定实现类调用
ExtensionLoader<UserService> extensionLoader = ExtensionLoader.getExtensionLoader(UserService.class);
UserService userServiceAImpl = extensionLoader.getLoadedExtension("a");
userServiceAImpl .test1();
JDK的SPI和Dubbo的SPI区别
a.ServiceLoader 和 ExtensionLoader
b.文件夹路径META-INF/services 和 META-INF/dubbo
c.文件内容dubbo多了个实现类的别名