dubbo的SPI机制

一.dubbo的SPI机制

SPI机制是一个服务发现机制,通过接口的全限定名找到指定目录下对应的文件,然后加载对应的实现类注册到系统中进行使用。

在Java原生跟mysql的驱动加载也使用了这个机制,但是他们只能进行全部实现类的加载(遍历了所有的实现类并实例化),消耗了资源

  • Dubbo优化了这个机制,使用了键值对的形式进行加载,实现了按需加载。
  • 并且增加了缓存实例,提高读取性能
  • 提供了对IOC和AOP等高级功能的支持,以实现更多类型的扩展

二.如何实现SPI机制

SPI服务提供接口是Java的重要机制,主要用于实现模块化开发和插件化扩展。

SPI机制允许服务提供者通过特定的配置文件将自己的实现注册到系统中,然后系统通过反射机制动态加载这些实现,而不需要修改原始框架的代码,从而实现了系统的解耦,提高了可扩展性。

一个典型的SPI应用场景是JDBC,不同的数据库驱动程序开发者可以使用JDBC库,然后定制自己的数据库驱动程序

此外,我们使用的主流Java开发框架中,几乎都使用了SPI机制,比如Servlet容器、日志框架、ORM框架、Spring框架

虽然Java内置了ServiceLoader来实现SPI,但是如果想定制多个不同的接口实现类。就没办法在框架中指定使用哪一个了,也就无法实现像”通过配置快速指定序列化器“这样的需求。

所以我自己定义了SPI机制的实现,能够给每个自行扩展的类指定键名。

比如读取如下配置文件,能够得到一个序列化器=>序列化器实现对象的映射。之后就可以根据用户配置的序列化器名称动态加载指定实现类对象了

具体实现方法如下:

1)指定SPI的配置目录,并且将配置再分为系统内置SPI和用户自定义SPI,便于区分优先级和维护。

2)编写SpiLoader加载器,实现读取配置、加载实现类的方法

  1. 用Map来存储已加载的配置信息 键名---实现类
  2. 通过Hutool工具库提供的ResourceUtil.getResources扫描指定路径,读取每个配置文件,获取到键名--实现类信息并存储再Map中。
  3. 定义获取实例方法,根据用户传入的接口和键名,从Map中找到相应的实现类,然后通过反射获取到实现类对象。可以维护一个对象实例缓存,创建过一次的对象从缓存中读取即可。

3)重构序列化器工厂,改为从SPI加载指定的序列化器对象

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

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

相关文章

mysql创建新表,同步数据

import os import argparse import glob import cv2 import numpy as np import onnxruntime import tqdm import pymysql import time import json from datetime import datetime os.environ[“CUDA_VISIBLE_DEVICES”] “0” # 使用 GPU 0 def get_connection(): “”“创…

最新HTML5中的文件详解

第5章 HTML5中的文件 5.1选择文件 可以创建一个file类型的input,添加multiple属性为true,可以实现多个文件上传。 5.1.1 选择单个文件 1.功能描述 创建file类型input元素,页面中不再有文本框,而是 选择文件 按钮,右侧是上次文件的名称&a…

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark…

解析 MySQL 数据库的 Python 接口:`mysqlclient` 与 `django-mysql` 实战指南20240904

博客标题:深入解析 MySQL 数据库的 Python 接口:mysqlclient 与 django-mysql 实战指南 引言 在现代 Web 开发中,数据库与应用程序的交互是不可避免的核心环节。对于使用 Python 尤其是 Django 框架的开发者来说,如何有效地与 M…

线性因子模型 - 概率PCA和因子分析篇

序言 在探索数据科学与机器学习的浩瀚领域中,深度学习作为一股不可小觑的力量,正以前所未有的方式重塑着我们对数据处理与知识发现的理解。在这一宏大的框架下,概率主成分分析( Probabilistic PCA, pPCA \text{Probabilistic PCA…

Python3中dict字典类型的用法

字典是另一种可变容器模型,且可存储任意类型对象。 key与value 允许存储任意类型对象 但key 不支持 list列表、字典等可变类型 字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 1、定义字典…

数据分析面试题:客户投保问题分析

目录 0 场景描述 1 数据准备 2 问题分析 2.1 计算小微公司的平均经营时长 2.2 计算小微公司且角色为投保人,保险起期在18年的总保费 2.3 假设,DWD_CUSTOMER_REL客户关联关系表中,存在部分客户保单数很多,部分客户保单数很少的情况,此时DWD_CUSTOMER_BASE表关联,程序…

鸿蒙OS试题

60当您开始开发一个应用/服务时,首先需要根据工程创建向导,创建一个新的工程,工具会自动生成对应的代码和资源模板。关于新建工程,下列选项说法正确的是? A.、创建用于Lite Wearable设备的工程,可以选择Native C工程…

百度智能云向量数据库创新和应用实践分享

本文整理自第 15 届中国数据库技术大会 DTCC 2024 演讲《百度智能云向量数据库创新和应用实践分享》 在 IT 行业,数据库有超过 70 年的历史了。对于快速发展的 IT 行业来说,一个超过 70 年历史的技术,感觉像恐龙一样,非常稀有和少…

Anaconda Prompt 安装paddle2.6报错

bug描述 python 3.11.9 通过 pip install paddlepaddle2.6.1 安装后,运行 paddle.utils.run_check() 则出现下面的错误: 解决办法 方法一:使用paddle 3的版本 这里要注意我的python版本 方法二:使用低版本的python python3.9…

[项目][CMP][直接向堆申请页为单位的大块内存]详细讲解

目录 1.系统调用 1.系统调用 Windows和Linux下如何直接向堆申请页为单位的大块内存&#xff1a; VirtualAllocbrk和mmap // 直接去堆上按页申请空间 static inline void *SystemAlloc(size_t kpage) { #ifdef _WIN32void *ptr VirtualAlloc(0, kpage << 13, MEM_COMM…

Lombok jar包引入和用法

大家好&#xff0c;今天分享一个在编写代码时的快捷方法。 当我们在封装实体类时&#xff0c;会使用set、get等一些方法。如下图&#xff0c;不但费事还影响代码的美观。 那么如何才能减少代码的冗余呢&#xff0c;首先lib中导入lombok的jar包并添加库。 此处我已导入&#xf…

Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)

目录 介绍 准备工作 配置jenkins 构建部署任务 常见问题 介绍 在平常开发前端vue项目时,我们通常需要将vue项目进行打包构建,将打包好的dist目录下的静态文件上传到服务器上,但是这种繁琐的操作是比较浪费时间的,可以使用jenkins进行自动化构建部署前端vue 准备工作 准备…

如何设计实现完成一个FPGA项目

设计并完成一个FPGA项目是一个复杂但非常有价值的工程任务。以下是一个详细的步骤指南,帮助你从零开始完成一个FPGA项目。 1. 项目定义与需求分析 确定项目目标:明确项目要实现的功能和性能指标。需求分析:列出所有功能需求、性能需求、接口需求等。可行性分析:评估技术可…

Linux操作系统命令集(一)

最近开了操作系统的课&#xff0c;弄着虚拟机的linux系统命令学学 文件和目录操作命令&#xff1a; ls&#xff1a;列出目录内容 示例&#xff1a;ls -l 以长格式列出目录内容cd&#xff1a;切换目录 示例&#xff1a;cd /home/user 切换到 /home/user 目录mkdir&#xff1a;…

《粮食科技与经济》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《粮食科技与经济》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《粮食科技与经济》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a; 湖南省粮食和物资储备局 …

bat批处理实现从特定文件夹中提取文件内容并以父文件夹名存储

1、需求分析 标题是bat批处理实现从特定文件夹中提取文件内容并以父文件夹名存储。这里面我们要做的工作是&#xff1a; ①、批处理脚本使用的是bat文件&#xff1b; ②、文件夹下面有很多子文件夹&#xff0c;然后子文件夹下仍然有相同的文件结构&#xff0c;我们需要从三级…

halcon 自定义距离10的一阶导数幅图,摆脱sobel的3掩码困境

一&#xff0c;为什么要摆脱3的掩码 在处理图像的过程中&#xff0c;会用到平滑算子&#xff0c;很容易破坏边际&#xff0c;所谓的一阶导数sobel只计算掩码为3的差分&#xff0c;在幅度图分割中&#xff0c;往往是很难把握的。 举个例子-现在图像头平滑好了&#xff0c;缺陷…

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用&#xff0c;模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇&#xff0c;同时也伴随着一系列需要克服的挑战&#xff0c;如何看待企业引进增材制造&#xff0c;小编为您全面分析。 机遇篇&#xff1a; 加…

Codeforces Round (Div.3) C.Sort (前缀和的应用)

原题&#xff1a; time limit per test&#xff1a;5 seconds memory limit per test&#xff1a;256 megabytes You are given two strings a and b of length n. Then, you are (forced against your will) to answer q queries. For each query, you are given a range …