loadResource 方法用于读取和解析配置文件,并通过反射加载类,最后调用 loadClass 方法进行其他操作 。loadClass 方法用于主要用于操作缓存 , 该方法的逻辑如下:
private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL,Class<?> clazz, String name) throws NoSuchMethodException {if (!type.isAssignableFrom(clazz)) {throw new IllegalStateException("...");}// 检测目标类上是否有 Adaptive 注解if (clazz.isAnnotationPresent(Adaptive.class)) {if (cachedAdaptiveClass == null) {// 设置 cachedAdaptiveClass缓存cachedAdaptiveClass = clazz;} else if (!cachedAdaptiveClass.equals(clazz)) {throw new IllegalStateException("...");}// 检测 clazz 是否是 Wrapper 类型} else if (isWrapperClass(clazz)) {Set<Class<?>> wrappers = cachedWrapperClasses;if (wrappers == null) {cachedWrapperClasses = new ConcurrentHashSet<Class<?>>();wrappers = cachedWrapperClasses;}// 存储 clazz 到 cachedWrapperClasses 缓存中wrappers.add(clazz);// 程序进入此分支,表明 clazz 是一个普通的拓展类} else {// 检测 clazz 是否有默认的构造方法,如果没有,则抛出异常clazz.getConstructor();if (name == null || name.length() == 0) {// 如果 name 为空,则尝试从 Extension 注解中获取 name , 或使用小写的类名作为 namename = findAnnotationName(clazz);if (name.length() == 0) {throw new IllegalStateException("...");}}// 切分 nameString[] names = NAME_SEPARATOR.split(name);if (names != null && names.length > 0) {Activate activate = clazz.getAnnotation(Activate.class);if (activate != null) {// 如果类上有 Activate 注解,则使用 names 数组的第一个元素作为键 , // 存储 name 到 Activate 注解对象的映射关系cachedActivates.put(names[0], activate);}for (String n : names) {if (!cachedNames.containsKey(clazz)) {// 存储 Class 到名称的映射关系cachedNames.put(clazz, n);}Class<?> c = extensionClasses.get(n);if (c == null) {// 存储名称到 Class 的映射关系extensionClasses.put(n, clazz);} else if (c != clazz) {throw new IllegalStateException("...");}}}}}如上,loadClass 方法操作了不同的缓存 , 比如 cachedAdaptiveClass、cachedWrapperClasses 和 cachedNames 等等 。除此之外,该方法没有其他什么逻辑了 。
参考资料
- Java SPI 思想梳理
- Dubbo SPI
- springboot 中 SPI 机制
- SpringBoot 的自动装配原理、自定义 starter 与 spi 机制 , 一网打尽
推荐阅读
- Redisson源码解读-分布式锁
- 红米note9pro评测最新_红米note9pro深度测评
- EasyPoi大数据导入导出百万级实例
- Dubbo-聊聊通信模块设计
- 1分钟完成在线测试部署便捷收集班级同学文件的web管理系统
- 联想拯救者R7000 2021款官方配置_联想拯救者R7000 2021款升级情况
- 简易版 纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码
- 三年级数学下册练习题300道 三年级数学计算题300道
- 【lwip】10-ICMP协议&源码分析
- 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动