深入了解Dubbo SPI 工作机制——@Adaptive(6)

news2024/9/21 22:20:03

@Adaptive这个注解就是适配策略,我都是称呼为最佳适配子类,或者最佳适配类。就是找到最佳的子实现类的,其实就是默认的类。这个注解可以打在类上方,那么dubbo SPI机制通过接口获取实例类,就是获取到有@Adaptive注解的实现类。

接口:

package com.enjoy.service;

import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.Adaptive;
import com.alibaba.dubbo.common.extension.SPI;

import java.rmi.RemoteException;
import java.util.Map;

/**
 * SPI 全称为 Service Provider Interface,是一种服务发现机制,目标是为接口寻找实现类。
 * Java SPI 的作法:
 * 		1.在类路径下META-INF/service下创建文件,名称为接口的全限定名。
 * 		2.将接口实现类的全限定名配置在文件中
 * 		3.服务启动时,将由服务加载器读取配置文件,并加载实现类。
 *
 * Dubbo SPI的作法:
 * 		1.Dubbo 增强原生的SPI机制来更好的满足拓展要求,其以键值对的方式对接口的实现进行配置管理。
 * 		2.Dubbo引入三个注解: SPI、Adaptive和Activate。
 *
 * 	只有标注了SPI注解的接口,才是Dubbo的菜
 */
@SPI("b")
public interface InfoService {
	Object sayHello(String name) ;
	//@Adaptive
	Object passInfo(String msg, URL url) ;
}

实现类 InfoServiceAImpl:

package com.enjoy.infoService.impl;


import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.Activate;
import com.enjoy.service.InfoService;

public class InfoServiceAImpl implements InfoService {

    @Override
    public Object sayHello(String name) {
        System.out.println(name+",你好,调通了A实现!");
        return name+",你好,调通了A实现!";
    }

    @Override
    public Object passInfo(String msg, URL url) {
        System.out.println("恭喜你,调通了A实现");
        return msg;
    }

}

实现类InfoServiceBImpl

package com.enjoy.infoService.impl;


import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.Activate;
import com.enjoy.service.InfoService;

public class InfoServiceBImpl implements InfoService {

    @Override
    public Object sayHello(String name) {
        System.out.println(name+",你好,调通了B实现!");
        return name+",你好,调通了B实现!";
    }

    @Override
    public Object passInfo(String msg, URL url) {
        System.out.println("恭喜你,调通了B实现");
        return msg;
    }

}

实现类InfoServiceCImpl

package com.enjoy.infoService.impl;


import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.common.extension.Adaptive;
import com.enjoy.service.InfoService;

@Adaptive
public class InfoServiceCImpl implements InfoService {

    @Override
    public Object sayHello(String name) {
        System.out.println(name+",你好,调通了C实现!");
        return name+",你好,调通了C实现!";
    }

    @Override
    public Object passInfo(String msg, URL url) {
        System.out.println("恭喜你,调通了C实现");
        return msg;
    }

}

测试:

case1:类上有@Adaptive注解,那么调用这个接口的方法,就会调用@Adaptive注解类的方法

 

case 2: @Adaptive也可以在接口中打在具体的方法上,然后根据URL传递的key选择具体的实现类,很灵活

 

注释掉之前的实现类C:

测试:

 

 需要说明的是 test://localhost/test?info.service=a.  info.service就是接口名InfoService的驼峰,还需要用 . 将各个单词拆分。当然我们也可以直接在接口中,给@Adaptive定义个名称,然后URL也需要修改

接口定义:

测试case中URL也需要修改:

 

至此,@Adaptive的功能演示完毕。

源码分析

那么,它是如何做到这样的功能的呢? 还是看源码,加载 ExtensionLoader 的流程是一样的,不懂可以看上一篇深入了解Dubbo SPI 工作机制——@Activate (5)_chen_yao_kerr的博客-CSDN博客

下面全是debug的流程:

1:

 

2:

 

我们看到步骤3中得到一个String code,而这个code就是我们拼接出来的一个静态代理类,它负责根据URL中的key调用具体的业务实现类。下面我拷贝出来它拼写的类:

通过代码确认,我们可以知道实际上我们获取到的是静态代理类

 

而最后一步,就是调用静态代理类的拼接好了的业务方法,整个流程就走通了。

 

个人觉得,这种适配的方式可以动态的根据URL选择具体的实现类,很灵活。但是,老是需要在方法中定义URL,这样静态代理类才能够根据Dubbo的适配方式去选择具体的实现类,写起来有点累赘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WooCommerce商城开发:高性能订单存储数据库模式

这是一系列深入探讨的第一部分,专门用于解释高性能订单存储数据库模式的实施。 与1 月份提出的版本相比,数据库模式的变化很小。我们在不同的地方添加和删除了几列,但整体表结构与第一个提案中描述的相同: 我们在此项目中添加了4…

51单片机(九)LED点阵屏

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&#xff0…

RabbitMQ消息队列实战(5)—— 发后即忘和远程RPC数据传输模型

本文我们学习下使用RabbitMQ实现的几种数据发送的模型——发后即忘模型和远程RPC调用。二者实际上是从业务的角度定义的一个RabbitMQ的使用模型。发后即忘模型,强调发送时不太关心消息接收者的执行结果,仅仅是为了发送信息。而远程RPC调用模型强调&#…

vulnhub靶场之double:1

1.信息收集 探测存活主机,发现192.168.239.178存活 对目标主机192.168.239.176进行端口扫描,发现存活22(SSH)、25(smtp)、80、8080端口。 浏览器访问http://192.168.239.178,发现有两个链接。查看源码发现一个是跳转到/production&#xf…

David Silver Lecture 6: Value function approximation

1 Introduction pipeline大致讲完了,开始到数值计算的部分。 1.1 大规模的运算 对于这种大规模运算,如何拓展前面两个章节的内容,进行实战。 1.1.1 回顾value function approximation 1.1.3 which function approximator 强化学习中的值函…

java源码----集合系列1----ArrayList,linkedList

Arraylist 基础信息 底层是一个object数组 Arraylist 是java里面Collection 标准的一个集合,其底层是一个object数组。当new一个空参的ArrayList的时候,会默认生成一个空数组。 Arraylist上限是 Integer.MAX_VALUE - 8(Integer.MAX_VALUE 2^31-1);…

一文搞定接口测试及常用接口测试工具解析

目录 首先,什么是接口呢? 一、常见接口: 二、前端和后端: 三、什么是接口测试: 四、接口组成 五、为什么要做接口测试: 六、接口测试怎么测: 七、用什么工具测 首先,什么是接…

软件工程开发文档写作教程(06)—项目建议书写作规范

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 项目建议书概述 项目建议书一般是由主策划或者项目经理负责编写的。进行可行性分析是一个自…

3.编写油猴脚本之-helloword

3.编写油猴脚本之-helloword Start 通过上一篇文章的学习,我们安装完毕了油猴插件。今天我们来编写一个helloword的脚步,体验一下油猴。 1. 开始 点击油猴插件>添加新脚本 默认生成的脚本 // UserScript // name New Userscript // name…

Linux介绍及环境搭建

文章目录 🎬1.Linux背景💻1.1 计算机的发展💻1.2 操作系统的故事💻1.3 Linux操作系统💻1.4 Linux的应用场景💻1.5 Linux版本 🔌2. Linux环境💾2.1 环境选择💾2.2 云服务器…

u1s1,查问题已经从百度到Google,再从Google到gpt了

现在查问题,查资料,基本都是问gpt。 感觉AI的回答会比较智能。 除了解释说明,还会附录Demo源码。 而且没有广告和其他杂七杂八的。 方便/快捷,提高了工作效率。 举例 上传图片后无法渲染的文章,发现数据库的图片地址前缀带blob,可…

数据结构-查找-线性结构(顺序、折半、分块)查找

目录 一、顺序查找 *查找效率分析 二、折半查找 *查找效率分析 三、分块查找 *查找效率分析 一、顺序查找 有称线性查找, 算法思想:从头到尾挨个查找(反过来也行) typedef struct{int *elem; //数据int TableLen; …

MySQL原理(六):日志

前言 上一篇介绍了 MySQL 的锁,这一篇将介绍日志相关的内容。 MySQL 中最常见的日志有三类: undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 …

MATLAB程序在设备端部署实例

背景介绍 MATLAB广泛应用于物理系统建模、测量测试、系统控制以及深度学习等,在工程实践中具有非常重要的地位,具体如图1所示。调研发现,科研人员能够编写各种matlab代码,通过建模仿真来更好的认识世界。近年来,随着物…

《LeetCode》—— 摆动序列

今天,我们要讲解的是 “摆动序列” 这道题目。对于这道题目,我们可以从贪心的思想去解决,也可以使用动态规划的方法。接下来,我通过这两种方法的讲解让你轻松拿捏它! 目录 (一)贪心算法 1、上下…

跑在笔记本里的大语言模型 - GPT4All

何为GPT4All GPT4All 官网给自己的定义是:一款免费使用、本地运行、隐私感知的聊天机器人,无需GPU或互联网。 从官网可以得知其主要特点是: 本地运行(可包装成自主知识产权🐶)无需GPU(穷人适配…

sort、uniq、tr、cut的使用

管理文件内容的使用 一、sort命令二、uniq命令三、tr命令四、cut命令 一、sort命令 sort命令是以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序,比较原则是从首字符向后,依次按ASCII码进行比较,最后将他们按升序输…

Linux:rpm查询安装 yum安装

环境: 需要插入安装镜像 镜像内有所需的安装库 我这里使用的虚拟机直接连接光盘 连接的光盘挂载在/dev/cdrom 由于我们无法直接进入,所以选择把/dev/cdrom挂载到别的地方即可 mount /dev/cdrom /123 将/dev/cdrom 挂载到 /123 目录下 Packages下就是…

C++笔记—— 第十七篇 智能指针 C++11来了(下)

目录 1. 为什么需要智能指针 2. 内存泄漏 2.1 什么是内存泄漏,内存泄漏的危害 2.2 内存泄漏分类 2.3如何避免内存泄漏 3.智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr shared_ptr的线…