JavaSPI
实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。具体而言: 1. 定义一组接口, 假设是 autocomplete.PrefixMatcher; 2. 写出接口的一个或多个实现(autocomplete.EffectiveWordMatcher, autocomplete.SimpleWordMatcher); 3. 在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个以接口命名的文件 autocomplete.PrefixMatcher, 内容是要应用的实现类(autocomplete.EffectiveWordMatcher 或 autocomplete.SimpleWordMatcher 或两者); 4. 使用 ServiceLoader 来加载配置文件中指定的实现
例:
ExtensionLoader
private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
1、SPI机制加载具体的mapping,例:
2、封装成具体的ExtensionLoader
3、创建接口具体的代理实现
getExtension 最后返回的是包装类(ProtocolFilterWrapper等)
4、根据URL参数,获取加载哪个实现的Protocol
网友评论