一、前言

我之前研究过微博的Motan框架(当时接触的第一个RPC框架),当时懵懵懂懂,现在,上手SOFARPC框架,感觉比较轻松,事物的本质都是相通的。以前写博文,会逐行分析源码,慢慢地发现,源码其实就是作者的思想。看完源码后,弄懂作者的意图,可能类似读书的过程,书由厚读到薄,随着眼界的开阔,再看源码时,会带着评判的眼光,看出哪里写的好与不好,这也就是读书又由薄到厚的下一个阶段吧!废话结束,开始正文。

二、特点

SPI多应用于框架的建设中,方便解耦,利于扩展。SOFARPC的SPI,与原生的SPI相比,有如下特点:

★按需加载
★单例设置
★别名
★设置扩展类的优先级,可进行覆盖
★指定扩展类位置
★解耦
SOFARPC的SPI流程图如下(记住这张图):

三、示例

好的框架,离不开好的示例。看一下SOFARPC给我们提供的SPI示例。

public class ExtensionMain {public static void main(String[] args) {Person person = ExtensionLoaderFactory.getExtensionLoader(Person.class).getExtension("A");        // 上面这行,大家自己debug跟一下就好,代码很简单,记住上面流程图,一步步跟踪代码,之后,会有一个更深刻的认识的!person.getName();}
}@Extensible          // 这个注解表示它是一个扩展点
public interface Person {void getName();
}@Extension("A")     // 这个注解表示它是一个扩展类,它的别名是A
public class PersonA implements Person {private final static Logger LOGGER = LoggerFactory.getLogger(PersonA.class);@Overridepublic void getName() {LOGGER.info("li wei");}
}

在上方示例的基础上,配置META-INF下的扩展描述文件,我们便可以实现自由扩展。

这里,贴上了扩展的注解类。

 1 /**
 2  * <p>代表这个类或者接口是可扩展的,默认单例、不需要编码</p>
 3  */
 4 @Documented
 5 @Retention(RetentionPolicy.RUNTIME)
 6 @Target({ ElementType.TYPE })
 7 public @interface Extensible {
 8
 9     /**
10      * 指定自定义扩展文件名称,默认就是全类名
11      *
12      * @return 自定义扩展文件名称
13      */
14     String file() default "";
15
16     /**
17      * 扩展类是否使用单例,默认使用
18      *
19      * @return 是否使用单例
20      */
21     boolean singleton() default true;
22
23     /**
24      * 扩展类是否需要编码,默认不需要
25      *
26      * @return 是否需要编码
27      */
28     boolean coded() default false;
29 }

 1 /**
 2  * 扩展点
 3  *
 4  * @author <a href=mailto:zhanggeng.zg@antfin.com>GengZhang</a>
 5  * @see Extensible
 6  */
 7 @Documented
 8 @Retention(RetentionPolicy.RUNTIME)
 9 @Target({ ElementType.TYPE })
10 public @interface Extension {
11     /**
12      * 扩展点名字
13      *
14      * @return 扩展点名字
15      */
16     String value();
17
18     /**
19      * 扩展点编码,默认不需要,当接口需要编码的时候需要
20      *
21      * @return 扩展点编码
22      * @see Extensible#coded()
23      */
24     byte code() default -1;
25
26     /**
27      * 优先级排序,默认不需要,大的优先级高
28      *
29      * @return 排序
30      */
31     int order() default 0;
32
33     /**
34      * 是否覆盖其它低{@link #order()}的同名扩展
35      *
36      * @return 是否覆盖其它低排序的同名扩展
37      * @since 5.2.0
38      */
39     boolean override() default false;
40
41     /**
42      * 排斥其它扩展,可以排斥掉其它低{@link #order()}的扩展
43      *
44      * @return 排斥其它扩展
45      * @since 5.2.0
46      */
47     String[] rejection() default {};
48 }

转载于:https://www.cnblogs.com/lihao007/p/10480472.html

SOFARPC —— SPI 解析相关推荐

  1. 【获奖榜单公布】遇见27岁的Java,分享你的开发者故事

    征文活动官网:https://marketing.csdn.net/p/264aeefaf27a0e052b3f2ef8ab388dc4 1995 年 5 月 23 日,Java 诞生. 凭借着&qu ...

  2. Java SPI 源码解析及 demo 讲解

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Java实现QQ登录和微博登录个人原创+1博客:点击前往,查看更多 作者:JlDang 来源:https://s ...

  3. 基于STM32+0.96寸OLED - - 7脚SPI接线显示+代码解析

    前言  本次我们学习一下STM32关于SPI七脚OLED的 接线方法,OLED的代码解析,主要教会大家怎么使用OLED调试和看懂OLED驱动的代码,让大家对OLED有个简单的了解,本篇博客大部分是自己 ...

  4. 【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 注意:dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外 文章目 ...

  5. AD9364 测试平台开发——第六篇,SPI配置内容解析

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 AD9364 测试平台开发--第六篇,SPI配置内容解析 以下为个人的一些理解,有一些东西可能不一定理解透彻了,可能有错误,请指正和见 ...

  6. Dubbo的可扩展机制SPI源码解析

    内容概要: Dubbo SPI案例演示 Dubbo SPI主流程源码解析 Dubbo中的依赖注入源码解析 Dubbo中的AOP实现源码解析 Dubbo中的Adaptive机制源码解析 文章目录 一.D ...

  7. Dubbo源码解析-——SPI机制

    文章目录 一.什么是SPI机制 二.Java原生的SPI机制 2.1.javaSPI示例 2.1.1.编写接口和实现类 2.1.2.编写配置文件 2.1.3.通过SPI机制加载实现类 2.1.4.JA ...

  8. 嵌入式开发基础—SPI通信协议解析

    嵌入式开发基础-SPI通信协议解析 1 通信方式(主从通信) 1.1 什么是主从通信 1.2 主从通信如何实现 1.2.1 相关控制引脚介绍 1.2.2 如何通过控制引脚实现主从通信 2 通信数据交换 ...

  9. Linux kernel 有关 spi 多个片选设备树参数解析

    一.最近做了一个 spi 设备驱动从板级设备驱动升级到设备树设备驱动,这其中要了解 spi 设备树代码的解析. 二. 设备树配置如下: 503 &spi0 {504 status = &quo ...

  10. Dubbo SPI机制和原理解析

    简介 SPI(service provider interface)是一种服务发现机制,通过加载指定路径下配置文件中的实现类,达到运行时用实现动态替换接口的目的.SPI常常用于扩展应用的功能,Dubb ...

最新文章

  1. 王道考研 计算机网络笔记 第四章:网络层
  2. PCL中可用的PointT类型
  3. 昵称到拼音php,php 汉字转换拼音程序_PHP教程
  4. mysql修改默认编码为UTF8
  5. 【五】搜索推荐技术在电商导购领域的应用——截图小王子
  6. 测试lazy_enable_if的所有变体
  7. Exchange Server2010系列之七:多邮箱搜索找出神秘邮件的幕后黑手
  8. 你真的会用 regexp_replace 吗?
  9. RancherOS v1.5.0发布
  10. 计算机技术在风景园林中的应用和选择,数字技术在风景园林设计中的应用
  11. jQuery中绑定事件的几种方法
  12. 电脑重置后我的电脑没有了怎么办_笔记本电脑没有声音怎么办?
  13. Liferay Portlet 结构分解
  14. python treeview控件使用详解_winform Treeview控件使用
  15. python 双色球 大乐透 5注随机选号
  16. Windows10+clion+opencv时报错0xC0000139和0xC0000135的解决方法之一
  17. SpringBoot实现微信登录
  18. 笔试编程题 拼凑正方形 Java题解 牛牛有4根木棍,长度分别为a,b,c,d。羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一。牛牛需要用这四根木棍拼凑一个正方
  19. JavaScript小技能:客户端 API
  20. 列联表中的相关测量(卡方值与相关系数之间的转换)

热门文章

  1. 移动硬盘读取速度一般是多少
  2. 近代物理实验 核磁共振的稳态吸收(含数据及参考题)
  3. Go 企业级框架 Revel 版全新发布
  4. python自动化所用到的库介绍
  5. 百分数转换小数 java_Java百分数之间算法 百分数转小数
  6. 美国东海岸的数据中心为风暴做好准备
  7. Egret MovieClip2
  8. python统计元音字母_统计元音字母
  9. 多表连接查询与高级查询上(第三天)
  10. Nuvoton M0518 之 程序烧录备注