Dubbo的SPI机制

Dubbo SPI的基本工作流程:

  1. 加载扩展点配置:Dubbo SPI首先会加载所有的扩展点配置,这些配置通常是在META-INF/dubbo目录下的properties文件中定义的。每个配置文件的名称就是扩展点接口的全限定名,文件内容是扩展点实现的键值对,键是扩展点的名称,值是扩展点实现类的全限定名。

  2. 创建扩展点实例:当用户获取一个扩展点时,Dubbo SPI会根据配置文件创建一个扩展点实例。如果配置文件中定义了多个扩展点实现,用户可以通过扩展点的名称获取特定的实现。

  3. 注入依赖:Dubbo SPI支持对扩展点实例进行依赖注入。如果扩展点实现类有其他扩展点的依赖,Dubbo SPI会自动将这些依赖注入到实例中。

  4. 包装扩展点:Dubbo SPI还支持对扩展点进行包装。用户可以定义一个包装类,这个类需要有一个接受原始扩展点实例的构造方法。当用户获取扩展点时,Dubbo SPI会自动用包装类包装原始的扩展点实例。

Dubbo SPI主要支持两种类型的依赖注入:

  1. Setter注入:这是最常见的一种依赖注入方式。在扩展点实现类中,如果有一个public的setter方法,且方法的参数类型是另一个扩展点接口,那么Dubbo SPI会自动调用这个setter方法,将对应的扩展点实例注入进去。例如,如果有一个setter方法是setFilter(Filter filter),那么Dubbo SPI会自动创建一个Filter的扩展点实例,并通过这个setter方法注入。

  2. 构造方法注入:除了setter注入,Dubbo SPI还支持通过构造方法进行依赖注入。如果扩展点实现类有一个构造方法,且这个构造方法的参数类型是另一个扩展点接口,那么Dubbo SPI也会自动创建一个对应的扩展点实例,并通过这个构造方法注入。例如,如果有一个构造方法是MyExtension(Filter filter),那么Dubbo SPI也会自动创建一个Filter的扩展点实例,并通过这个构造方法注入。

不支持setter方法和构造方法注入的情况下,Dubbo SPI如何实现依赖注入?

        如果一个扩展点实现类既没有合适的setter方法,也没有合适的构造方法,那么Dubbo SPI是无法直接进行依赖注入的。在这种情况下,我们需要手动进行依赖注入。

        Dubbo SPI提供了一个名为ExtensionLoader的类,这个类提供了一系列的方法,可以用来获取扩展点实例。例如,ExtensionLoader.getExtensionLoader(Filter.class).getExtension("myFilter")可以获取名为"myFilter"的Filter扩展点实例。

        我们可以在扩展点实现类的初始化代码中,使用这种方式手动获取需要的扩展点实例,并进行依赖注入。虽然这种方式比较麻烦,但是它提供了更大的灵活性,可以应对更复杂的依赖关系。

需要注意的是,手动依赖注入的方式并不推荐,因为它增加了代码的复杂性,并且可能导致依赖关系的管理变得困难。在大多数情况下,我们都应该优先使用setter方法或构造方法进行依赖注入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BSP视频教程第29期:J1939协议栈CAN总线专题,源码框架,执行流程和应用实战解析,面向车通讯,充电桩,模组通信等(2024-01-08)

视频教程汇总帖:【学以致用,授人以渔】2024视频教程汇总,DSP第12期,ThreadX第9期,BSP驱动第29期,USB实战第5期,GUI实战第3期(2024-01-08) - STM32F429 - 硬汉嵌入式论坛 …

【2024系统架构设计】 系统架构设计师第二版-面向服务架构设计理论与实践

目录 一 概述 二 SOA的参考架构 三 SOA主要协议和规范 四 SOA设计标准和原则 五 SOA的设计模式 六 SOA的构建和实施 ​

《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗

《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗 一部赓续红色血脉的生动教材 一部讴歌时代英雄和人民精神宝典 当历史的烽烟渐渐远去,留下的是一页页泛黄的记忆和无数英雄的壮丽诗篇。李传铭的力作《豫鄂烽火燎原大小焕岭》正是这样一部深情的回望&am…

AIGC必备知识点:你不可不知的CNN(卷积神经网络)-知识全解析!

Look!👀我们的大模型商业化落地产品📖更多AI资讯请👉🏾关注Free三天集训营助教在线为您火热答疑👩🏼‍🏫 大家在谈论的卷积神经网络究竟是什么?(Convolutional Neural Ne…

uniapp h5 发行后 微信第二次打开网址 页面白屏

发行后把网址给客户,第一次可以正常登录打开,第二次打开白屏 原因:第一次打开时没有token,所以跳转登录页,可以正常访问 第二次打开时有token,但是网址根目录没有配置默认页面,所以白屏 解决…

视频转为序列图的软件,让视频批量转为序列图

你是否曾经遇到过这样的困境:需要将一段视频转为一系列的图片,但却没有合适的工具来完成?或许你曾经手动截图,或者用其他方式,但结果往往不尽如人意,图片质量差、色彩失真、画面不清晰。现在,让…

Java实现获取两个时间节点之间的日期、月份、年份列表

我们在做一个需求的时候需要后端返回一个选中时间内的时间日期、月份、年份列表: 如:我想查询2024-01-01到2024-01-20这个时间里面的所有日期。 下面来看看代码 /*** 根据日期格式不同计算两个时间内的日期、月份、年* param beginTime 开始时间* para…

怎么把workspace的数据导入到simulink进行FFT分析?

怎么把数据导入到simulink在这篇博客已经阐述了,那么如何把数据导入到simulink还能进行FFT分析呢? 首先我们看simulink的FFT分析界面,(前置步骤:导入powergui模块,双击powergui模块,Tool选项卡…

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?

在互联网时代,爬虫技术被广泛应用于数据采集和处理。然而,在使用爬虫技术的过程中,经常会遇到IP被封禁的问题,这给数据采集工作带来了很大的困扰。因此,使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…

C++ Webserver从零开始:基础知识(一)——Linux网络编程基础API

前言 本专栏将从零开始制作一个C Webserver,用以记录笔者学习的过程 如果你想要跟着我这个专栏制作一个C Webserver,你需要掌握以下前置基础课程知识: 1.C/C的语法(在Leetcode刷100~200题的程度即可) 2.计算机网络基础知识 3…

Jmerer之FTP测试

1、文件上传下载测试,可以使用sample:FTP请求,当然也可以使用HTTP Request采样器中的File Upload向服务器上传文件 2、本章重点介绍FTP请求进行文件的上传下载测试,添加 FTP请求,界面主要配置如下: Server Name or I…

5G前装搭载率即将迈过10%大关,车载通讯进入多层次增长通道

对于智能化来说,车载通讯性能的提升,对于相关功能的用户体验优化、进一步减少通讯时延以及打开应用新空间,至关重要。 目前,2G/3G正在进入运营商逐步关闭运营的阶段,4G依然是主力,但5G也在迎来新的增长机会…

【深度学习 | 风格迁移】神经网络风格迁移,原理详解附详细案例源码

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

将Python程序打包成exe文件

一、什么是exe可执行文件? **exe文件英文全名是executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为.exe的是其中的一种。exe文件可以在Windows平台上直接双击运行&a…

蓝凌EIS智慧协同平台 多处SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 doc_fileedit_word.aspx、frm_form_list_main.aspx、frm_butt…

力士乐触摸屏维修触控屏VR2109.01-00-01-N2-NNN-A

Rexroth力士乐触控屏VCP20.1BUN.768PB-NN-PW数控系统屏幕维修及排查: 力士乐数控机床故障诊断的一般步骤都是相同的。当数控机床发生故障时,除非出现危险及数控机床或人身的紧急情况,一般不要关断电源,要尽可能地保持机床原来的状…

zotero云存储免费扩容到25G

zotero免费云存储只有300MB,若想扩容要么付费购买zotero的云空间,要么通过WebDAV方式使用云盘空间进行同步。很久以前好像尝试过坚果云盘,但是感觉有点辣鸡,网上的博客教程大部分都是用的坚果。 最后在淘宝上花了20找人远程了一下…

Google的Ndk-Sample学习笔记之一(hello-jniCallback)

前言: 近段时间因为项目的需求,需要使用JNI,所以下载了Google的Ndk-Sample学习下,准备记录 下来,留给后期自己查看 问题点一:JNI_OnLoad方法必须返回JNI的版本 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env;memset(&g_ctx, 0, sizeof(g_…

竞赛保研 基于深度学的图像修复 图像补全

1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学的图像修复 图像补全 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-se…

C#编程-实现多线程

实现多线程 多线程帮助同时执行各种操作。这为用户节省时间。多线程程序包括一个主线程和其他用户定义的线程以同时执行多个任务。 微处理器为执行的进程分配内存。每个进程占有内存中它们自己的地址空间。但是,所有在进程中的线程占有相同的地址空间。多线程允许在一个程序…