贡献,核心实现如下:
// 获取一个实现类全限定名String cn = nextName;// 加载这个类Class<?> c = Class.forName(cn, false, loader);// 使用反射创建对象c.newInstance()hasNextService()
完成堆配置文件的读取,nextService()
完成类的加载和对象的创建,这个一切都没有在ServiceLoader
创建时完成,这也是体现了延迟Lazy
的一个含义
load()与loadInstalled()loadInstalled()
和load()
一样,本质都是创建了一个ServiceLoader
d对象,不同点是使用的加载器不同,load()
使用的是Thread.currentThread().getContextClassLoader()
当前线程的上下文加载器,loadInstalled()
使用的是ExtClassLoader
加载器来加载
具体实现如下:
public static <S> ServiceLoader<S> loadInstalled(Class<S> service) { ClassLoader cl = ClassLoader.getSystemClassLoader(); ClassLoader prev = null; while (cl != null) { prev = cl; cl = cl.getParent(); } return ServiceLoader.load(service, prev); }使用这个方法将只扫描JDK
安装目录jre/lib/ext
下的jar
包中指定的实现,我们应用程序类路径下的实现将会被忽略掉
Java SPI的问题
Java SPI
虽然使用了懒加载机制,但是其获取一个实现时,需要使用迭代器循环加载所有的实现类
- 【JavaSPI详解】当需要某一个实现类时,需要通过循环一遍来获取
Dubbo
实现自己的SPI
机制时进行了增强,可以仅加载自己想要的扩展实现 。为什么SPI机制打破了双亲委派模型 ??想不明白 说不清楚,想明白再补充
参考资料
- Java SPI 使用及原理分析
经验总结扩展阅读
- 九 Istio:istio安全之授权
- 分布式ID生成方案总结整理
- GCC 指令详解及动态库、静态库的使用
- 五 Istio:使用服务网格Istio进行流量路由
- pta第二次博客
- java中GC的日志认识详解
- 2023年摩羯座财运1月运程详解如何提高
- 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng
- JUC中的AQS底层详细超详解
- 图文详解 微服务 Zipkin 链路追踪原理