Dubbo源码(一)-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: Dubbo源码(一)-SPI使用

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

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

(0)

大家都在看

  • 符合标准的正常工作的对联广告(漂浮广告JS代码)

    符合标准的正常工作的对联广告JS代码(漂浮广告)。DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN…

    数据库 2023年6月11日
    079
  • String字符串用逗号拼接,防止最后一位是逗号

    StringBuilder sb = new StringBuilder(); for(String s strArr) { if (sb.length() > 0) {//…

    数据库 2023年6月16日
    0104
  • mysql创建用户并授权

    新建用户 create user ‘username’@’%’ identified by ‘password’; • user_name:要创建用户的名字。• host:表示要这…

    数据库 2023年5月24日
    064
  • SQL的语法

    创建: create database [if not exists] 数据库名称 [default charset 字符集] [collate 排序规则]; (PS:方括号(&#…

    数据库 2023年6月16日
    086
  • MySQL中读页缓冲区buffer pool

    Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理。我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其…

    数据库 2023年5月24日
    0113
  • SQL注入学习

    SQL注入学习——资源、笔记整理 OWASP-top10(2021) SQL注入产生原因:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作;注入攻击属于服务端攻击,他与操…

    数据库 2023年6月9日
    077
  • 垃圾回收算法的原理及应用

    概述 有java开发经历的小伙伴必然对 垃圾回收不陌生。垃圾回收简单来说就是一种自动的内存管…

    数据库 2023年6月11日
    0104
  • [LeetCode]9. 回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解…

    数据库 2023年6月9日
    0165
  • Java基础七—Java并发基础

    一个类在可以被多个线程安全调用时就是线程安全的。 线程安全不是一个非真即假的命题,可以将共享数据按照安全程度的强弱顺序分成以下五类: 不可变、绝对线程安全、相对线程安全、线程兼容和…

    数据库 2023年6月6日
    0252
  • visual studio 2015 IOS开发连接mac时提示错误couldn’t connect to xxxx, please try again的一个方法

    本人使用虚拟机MAC。原本使用虚拟机中的VS2015连接正常没有问题。 但是当把MAC的虚拟机文件COPY到另一个机器上,提示”couldn’t conne…

    数据库 2023年6月14日
    087
  • 8086指令码汇总表(表格)

    8086指令码汇总表 8086指令有汇编语言指令和指令码两种形式,汇编语言指令形式经过汇编程序处理后生成指令码形式。 通过指令码形式可以帮助理解汇编语言指令格式的含义和用法。 80…

    数据库 2023年6月14日
    0156
  • Java 反射学习笔记

    反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做 Java 语言…

    数据库 2023年6月11日
    0100
  • SQL Server的Descending Indexes降序索引

    SQL Server的Descending Indexes降序索引 1、建立测试环境 测试环境:SQL Server 2012 表结构如下 USE [test] GO CREATE…

    数据库 2023年6月9日
    089
  • java 网络考试 在线教育系统 模块设计方案

    组建试卷:创建试卷,题目、类型、总分、及格分数、时长、出成绩方式、重复考试、公布答案、考试对象等 试卷题型:试卷明细,给试卷添加题型,分值,随机或者手动从题库选择试题,预览试题,自…

    数据库 2023年6月6日
    0100
  • centos修改时区信息

    1、date 查看系统时间 2、timedatectl 查看时区信息 3、timedatectl list-timezones 查看系统所有时区 4、timedatectl set…

    数据库 2023年6月11日
    0103
  • 重新学习数据库(2)

    单元概述 通过本章的学习能够了解MySQL数据库中多表查询的含义,掌握多表查询的基本写法,掌握特殊的多表查询的写法,掌握内连接和外连接的区别 测试数据脚本 drop TABLE e…

    数据库 2023年6月16日
    0192
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球