JavaSPI
package linag.test.dubbo.core.spi.javaspi;
/**
* @author wb-zgl234479
* @create 2018/08/28 20:52
**/
public interface ISayName {
void say();
}
package linag.test.dubbo.core.spi.javaspi;
/**
* @author wb-zgl234479
* @create 2018/08/28 20:52
**/
public class SayChineseName implements ISayName{
@Override
public void say() {
System.out.println("肥朝");
}
}
package linag.test.dubbo.core.spi.javaspi;
/**
* @author wb-zgl234479
* @create 2018/08/28 20:53
**/
public class SayEnglishName implements ISayName{
@Override
public void say() {
System.out.println("Toby");
}
}
package linag.test.dubbo.core.spi.javaspi;
import java.util.ServiceLoader;
/**
* @author wb-zgl234479
* @create 2018/08/28 20:55
**/
public class JavaSpiTest {
public static void main(String[] args) {
ServiceLoader<ISayName> loaders = ServiceLoader.load(ISayName.class);
for(ISayName sayName : loaders) {
sayName.say();
}
}
}
DubboSPI
一、提升性能
1)JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。
2)dubbo spi会缓存class和实例
3)可以直接根据key来获取实例,而不像jdk的spi一样需要循环判断
二 、增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。