房产网站建设机构,php学校网站系统,创可贴在线设计平台,长沙做网站建设价格dubbo采用微内核插件体系#xff0c;设计优雅#xff0c;扩展性很强。微内核插件体系是如何实现的呢#xff1f;想必大家都知道SPI(service provider interface)机制。这种机制的原理是假如我们定义了服务接口标准#xff0c;可以让厂商无实现。在jdk中#xff0c;使用Ser… dubbo采用微内核插件体系设计优雅扩展性很强。微内核插件体系是如何实现的呢想必大家都知道SPI(service provider interface)机制。这种机制的原理是假如我们定义了服务接口标准可以让厂商无实现。在jdk中使用ServiceLoader类来实现spi机制的服务查找功能。 接下来我们使用一个简单的例子通过ServiceLoader来实现spi机制。先定义一个接口 package com.ysl;public interface Spi {boolean isSupportType(String type);String sayGoodBy();
} ServiceLoader会遍历所有的jar去查找META-INF/services/com.ysl.Spi文件 假设A厂商提供的实现如下 package com.ysl;public class SpiAImpl implements Spi{Overridepublic boolean isSupportType(String type) {return A.equals(type);}Overridepublic String sayGoodBy() {return bye bye A;}
} 在A厂商提供的jar包中的META-INF/services/com.ysl.Spi文件内容为com.ysl.SpiAImpl(厂商A的spi实现全路径类名) 假设B厂商提供的实现如下 package com.ysl;public class SpiBImpl implements Spi{Overridepublic boolean isSupportType(String type) {return B.equals(type);}Overridepublic String sayGoodBy() {return bye bye B;}
} 在B厂商提供的jar包中的META-INF/services/com.ysl.Spi文件内容为com.ysl.SpiBImpl(厂商B的spi实现全路径类名) ServiceLoader.load(Spi.class)读取厂商A、B提供jar包中的文件ServiceLoader实现了Iterable接口可通过while for循环语句遍历出所有实现。 一个接口多种实现就如策略模式一样提供了策略的实现但是没有提供策略的选择 使用方可以根据isSupport方法根据业务传入厂商名来选择具体的厂商。 package com.ysl;import java.util.ServiceLoader;public class SpiFactory {private static ServiceLoader spiLoader ServiceLoader.load(Spi.class);public static Spi getSpi(String name){for(Spi spi : spiLoader){if(spi.isSupportType(name)){return spi;}}return null;}
} 转载于:https://www.cnblogs.com/senlinyang/p/8612458.html