SPI使用

Dubbo 的可扩展性是基于 SPI 去实现的,而且Dubbo所有的组件都是通过 SPI 机制加载。

SPI 全称为 (Service Provider Interface) ,是一种服务提供发现机制。可以将服务接口与服务实现分离以达到解耦可拔插、大大提升了程序可扩展性。

说人话:

一个接口有多个实现类,具体使用哪个实现类,通过SPI机制让用户来决定。也就是,定好规范,实现允许百花齐放。

举栗子:

以JDBC为例,Java提供了JDBC API用来连接 Java 编程语言和广泛的数据库。可是数据库种类这么多,无法一个个地去适配,怎么办?定好规范( Driver等一系列接口),实现类交由别人实现。

那么,实现类也有了,JDBC怎么知道该使用什么实现类(毕竟命名可以千奇百怪)?通过SPI

简单体验下,Dubbo SPI才是重点

基本示例

@SPI:此注解表示这是一个SPI接口,标注在类上。

碎碎念:

@SPI注解有value参数,可以配置默认实现类的key,例如:

// 接口的注解添加默认值
@SPI("norRobot")

// 获取实现类时将getExtension替换一下
// Robot robot = extensionLoader.getExtension("norRobot");
Robot robot = extensionLoader.getDefaultExtension();

Dubbo SPI提供了类似装饰器模式的实现

碎碎念:

原理就是 RobotWrapper只要有构造方法是有且只有一个参数,且这个参数是 Robot类型,就认为其实包装类,会自动将Robot通过构造方法注入。

所以 getExtension("norRobot")实际返回的是 RobotWrapper

自适应扩展

有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这就是Dubbo SPI自适应扩展的作用。

@Adaptive:此注解用于自适应扩展,可标注在类或者方法上。

@Adaptive标注在类上时,无需通过key指定需要获取的实现类,通过getAdaptiveExtension方法即可获取自适应扩展类。同一个接口,有且只能有一个实现类允许使用 @Adaptive标注

注意: @Adaptive标注在类上和标注在方法上是冲突的,将上一步的AdaptiveRobot删除,或者把AdaptiveRobot类的Adaptive注解注释掉

碎碎念:

动态选择实现类,是需要通过URL来传递参数的。也就是方法参数中需要包含URL对象或者方法参数中有getUrl()方法来提供URL对象。

Dubbo SPI也支持类似spring自动注入的功能,来看看怎么用。

碎碎念:

Dubbo SPI的自动注入,也支持注入Spring的bean,此处没有演示。

本文讲了Java SPI和Dubbo SPI的使用,至于DubboSPI的实现,请看下回分解。

Original: https://www.cnblogs.com/konghuanxi/p/16494591.html
Author: 王谷雨
Title: SPI使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621508/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 多线程共享模型之管程(下)

    共享模型之管程 wait、notify wait、notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 B…

    Java 2023年6月9日
    094
  • 软件工程 软件需求与软件需求规约 第1篇随笔

    2、软件需求与软件需求规约 1. 何为需求? 定义问题的基本要素是 “需求” 一个需求是一个有关”要予构造”的陈述,用以描述待开发产…

    Java 2023年6月16日
    078
  • Aerospike java client

    1、要求 java client 要求jdk8及以上版本 2、依赖包 maven com.aerospike aerospike-client 5.0.0 gradle repos…

    Java 2023年5月29日
    076
  • 【java多线程】线程池

    /** * ~:按位取反运算=>1则为0,0&#…

    Java 2023年5月29日
    076
  • Java的发展史

    在当时,客户端编程所迈出的最重要的一步就是 插件(plug-in) 的开发。通过这种方式,用户可以下载一段代码,并将其插入到浏览器中适当的位置,以此来为浏览器添加新的功能。 插件又…

    Java 2023年5月29日
    075
  • 使用Java Faker模拟测试数据

    当你需要为你的单元测试想出有用的测试数据时,你是否也经常没有灵感?不要担心,Java Faker来救你了!在这篇博客中,你将学习如何生成你的测试数据。在这篇博客中,你将学习如何生成…

    Java 2023年5月29日
    087
  • Java学习-第一部分-第二阶段-项目实战:坦克大战【3】

    坦克大战【3】 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 坦克大战0.6版 √增加功能 2. 记录玩家的成…

    Java 2023年6月15日
    081
  • 隐身衣揭秘–java中继承/隐藏/覆写

    故事背景 看过《哈利·波特》的娃们,想必一定还记得电影中的”隐形斗篷”。。这件隐形衣是哈利收到的圣诞礼物,也是死亡圣器中的三件套之一,它让哈利小盆友在执行任…

    Java 2023年5月29日
    078
  • SpringMVC实战入门教程,四天带你快速搞定springmvc框架

    SpringMVC 也叫Spring web mvc。是Spring 框架的一部分,是在Spring3.0 后发布的。 这里对SpringMVC框架进行一个简单的介绍: sprin…

    Java 2023年6月9日
    071
  • Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行。 ; 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全…

    Java 2023年6月13日
    060
  • Mybatis(解决属性名和字段名不一致的问题)

    5、Mybatis(解决属性名和字段名不一致的问题) 我们从数据库中取到的数据都会交给实体类,然后从实体类中拿到数据并操作数据,所以如果我们数据库中的字段要是和实体类中的属性不一致…

    Java 2023年6月13日
    052
  • 使用二进制重排 & Clang插桩技术点来进行iOS冷启动进行优化

    1.冷启动 1.1 什么是冷启动? 冷启动是指内存中不包含该应用程序相关的数据,必须要 从磁盘载入到内存中的启动过程。 注意: 重新打开 APP, 不一定就是冷启动。 当内存不足,…

    Java 2023年6月16日
    097
  • 2022-8-16 mysql 第二天 约束

    重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。 构建数据库 创建一张student表: DROP TABLE IF EXIST…

    Java 2023年6月13日
    074
  • Java高频面试题70道

    1、作用域public,private,protected,以及不写时的区别? 答:区别如下: 作用域 当前类 同一packag 子孙类 其他package public √ √ …

    Java 2023年6月7日
    082
  • Java高并发教程:详解NIO Selector类

    Java高并发教程:详解NIO Selector类 NIO Selector Java NIO Selector可以检查一个或多个Java NIO Channel实例,并确定哪些通…

    Java 2023年5月29日
    085
  • C# 线程手册 第七章 网络和线程 创建服务端

    好的,我们现在来创建服务端程序。由于目的系统的多客户端特性,我们在创建StockServer 程序时要采用一个稍微不同的方案。我们想要跟踪客户端行为并知道它们什么时候连接/断开。由…

    Java 2023年5月29日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球