一、前言

我之前研究过微博的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);
@Override
public void getName() {
LOGGER.info("li wei");
}
}

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

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

 /**
* <p>代表这个类或者接口是可扩展的,默认单例、不需要编码</p>
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface Extensible { /**
* 指定自定义扩展文件名称,默认就是全类名
*
* @return 自定义扩展文件名称
*/
String file() default ""; /**
* 扩展类是否使用单例,默认使用
*
* @return 是否使用单例
*/
boolean singleton() default true; /**
* 扩展类是否需要编码,默认不需要
*
* @return 是否需要编码
*/
boolean coded() default false;
}
 /**
* 扩展点
*
* @author <a href=mailto:zhanggeng.zg@antfin.com>GengZhang</a>
* @see Extensible
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface Extension {
/**
* 扩展点名字
*
* @return 扩展点名字
*/
String value(); /**
* 扩展点编码,默认不需要,当接口需要编码的时候需要
*
* @return 扩展点编码
* @see Extensible#coded()
*/
byte code() default -1; /**
* 优先级排序,默认不需要,大的优先级高
*
* @return 排序
*/
int order() default 0; /**
* 是否覆盖其它低{@link #order()}的同名扩展
*
* @return 是否覆盖其它低排序的同名扩展
* @since 5.2.0
*/
boolean override() default false; /**
* 排斥其它扩展,可以排斥掉其它低{@link #order()}的扩展
*
* @return 排斥其它扩展
* @since 5.2.0
*/
String[] rejection() default {};
}

SOFARPC —— SPI 解析的更多相关文章

  1. S3C2440的SPI解析

    位串行数据的频率.如果只希望发送,则接收数据可以保持伪位(dummy).此外如果只希望接收,则需要发送伪位'1'数据 使用SPI主要需要以下寄存器 选择SPI模式,中断模式,查询模式等SCK选择,主从 ...

  2. dubbo源码分析--dubbo spi解析

    1. 什么叫SPI? 简单总结就是一种使用类名字符串来动态实例化java类的方式,也就是反射. 2. java SPI与Dubbo SPI有什么区别 (此图来自网上,我没有刻意去截图) 然后在这个文件 ...

  3. 1. 源码分析---SOFARPC可扩展的机制SPI

    这几天离职在家,正好没事可以疯狂的输出一下,本来想写DUBBO的源码解析的,但是发现写DUBBO源码的太多了,所以找一个写的不那么多的框架,所以就选中SOFARPC这个框架了. SOFARPC是蚂蚁金 ...

  4. Dubbo中SPI扩展机制解析

    dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...

  5. SOFARPC源码解析-搭建环境

    文档地址:https://www.sofastack.tech 简介摘要 SOFA 是蚂蚁金服自主研发的金融级分布式中间件,包含构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服 ...

  6. JDK源码解析之Java SPI机制

    1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...

  7. dubbo源码解析-spi(4)

    前言 本篇是spi的第四篇,本篇讲解的是spi中增加的AOP,还是和上一篇一样,我们先从大家熟悉的spring引出AOP. AOP是老生常谈的话题了,思想都不会是一蹴而就的.比如架构设计从All in ...

  8. dubbo源码解析-spi(3)

    前言 在上一篇的末尾,我们提到了dubbo的spi中增加了IoC和AOP的功能.那么本篇就讲一下这个增加的IoC,spi部分预计会有四篇,因为这东西实在是太重要了.温故而知新,我们先来回顾一下,我们之 ...

  9. dubbo源码解析-spi(一)

    前言 虽然标题是dubbo源码解析,但是本篇并不会出现dubbo的源码,本篇和之前的dubbo源码解析-简单原理.与spring融合一样,为dubbo源码解析专题的知识预热篇. 插播面试题 你是否了解 ...

随机推荐

  1. 初识html与css

    ---恢复内容开始--- PS应用量尺寸w.h- 操作方式: 窗口,信息,右上角面板选项,标尺单位,像素切图- 操作方式: 切片工具, 文件 ,另存为web所有格式,jpeg,存储,切片:选中的切片, ...

  2. C入门注意事项

        C语言入门应该注意什么   进入IT行业,很多人一开始接触的都是C语言,C语言可以说是一门基础课程了,只要有了C语言的基础,那么以后不管是学什么语言都会比较容易上手.同时在学习其它语言时也可以 ...

  3. vsftp在iptables中的配置

    在 /etc/vsftpd/vsftpd.conf 文件末添加以下几行 pasv_enable=YESpasv_min_port=20000pasv_max_port=20010 在 iptables ...

  4. pyCharm中BeautifulSoup应用

    BeautifulSoup 是第三方库的工具,它包含在一个名为bs4的文件包中,需要额外安装,安装方式 非常简单,进入python的安装目录,再进入scripts子目录,找到pip程序, pip in ...

  5. 自己练习的一个小的demo的时候a标签关于href链接的问题

    一.Js的几种调用方法(参考总结的) 1.a href="javascript:js_method();" 这是常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且 ...

  6. css 清楚浮动的几种方式

    方法一: 使用clear属性的空元素 <div style="clear:both;"></div> 方法二:使用overflow属性 给浮动的元素容器添加 ...

  7. docker info 警告"WARNING: No swap limit support"

    vim/etc/default/grub 找到 GRUB_CMDLINE_LINUX="" 在双引号里面输入cgroup_enable=memory swapaccount=1 然 ...

  8. 学习Git笔记(更新中)

    参考网址:https://blog.csdn.net/zmx729618/article/details/52174373 跟着练习一下,写的很好. Git:是一个分布式版本控制系统. GitHub: ...

  9. 剑指Offer 65. 矩阵中的路径 (回溯)

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  10. Request对象和Response对象 JsonResponse对象 和 Django shortcut functions 和QueryDict对象

    request request属性 属性: django将请求报文中的请求行.头部信息.内容主体封装成 HttpRequest 类中的属性. 除了特殊说明的之外,其他均为只读的. ''' 0.Http ...