SPI、Spring SPI、SpringFactoriesLoader

一、SPI技术

SPI全名Service Provider interface,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。

Java SPI 是JDK内置的一种动态加载扩展点的实现。

这个机制在一般的业务代码中很少用到,但是在底层框架中却被大量使用,包括JDBC、Dubbo、Spring框架、日志接口中都有用到,不同的是有的使用Java原生的实现,有的框架则自己实现了一套SPI机制.

二、Spring SPI

Spring中的SPI相比于JDK原生的,它的功能更为强大,因为它可以替换的类型不仅仅局限于接口/抽象类,它可以是任何一个类,接口,注解

正因为Spring SPI是支持替换注解类型的SPI,这个特性在Spring Boot中的自动装配有体现(EnableAutoConfiguration注解):

Spring的SPI文件是有规矩的,它需要放在工程的META-INF下,且文件名必须为spring.factories ,而文件的内容本质就是一个properties;如spring-boot-autoconfigure包下的META-INF/spring.factories文件,用于自动装配的;

Spring SPI加载spring.factories文件的操作是使用SpringFactoriesLoader,SpringFactoriesLoader它不仅可以加载声明的类的对象,而且可以直接把预先定义好的全限定名都取出来;

三、SpringFactoriesLoader 

SpringFactoriesLoader类的主要作用是通过类路径下的META-INF/spring.factories文件获取工厂类接口的实现类,初始化并保存在缓存中,以供Springboot启动过程中各个阶段的调用。Spring的自动化配置功能,也与此息息相关。

SpringFactoriesLoader 工厂加载机制是 Spring 内部提供的一个约定俗成的加载方式,只需要在模块的 META-INF/spring.factories 文件中,以 Properties 类型(即 key-value 形式)配置,就可以将相应的实现类注入 Spirng 容器中。

Properties 类型格式:

key:value

key:是全限定名(抽象类|接口)

value:是实现类,多个实现类通过逗号进行分隔

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

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

相关文章

【数据集】2023自动驾驶开源数据集-学习笔记

文章目录 1. 自动驾驶有哪些公开数据集2. 预测相关的数据集有哪些 1. 自动驾驶有哪些公开数据集 waymo open dataset 适应任务: 域适应,2D追踪,2D检测,3D追踪,3D检测,实时2D检测,实时3D检测,交互…

深入解析Java内存模型

一、背景 并发编程本质问题是:CPU、内存以及IO三者之间的速度差异。CPU速度快于内存、内存访问速度又远远快于IO,根据木桶理论,程序性能取决于最慢的操作,即IO操作。这样会出现CPU和内存交互时,CPU性能无法被充分利用…

使用命令行查看同一局域网内所有ip地址

由于学科实践课程提供的局域网IP扫描软件在本机上运行时,无法扫描出树莓派(可能和防火墙设置有关?),所以记录一种通过命令行查看同一局域网下设备IP地址的方法,以手机热点下查找树莓派IP为例。 Step1&#…

Hive面经

hive原理 Hive 内部表和外部表的区别Hive 有索引吗运维如何对 Hive 进行调度ORC、Parquet 等列式存储的优点数据建模用的哪些模型?1. 星型模型2. 雪花模型3. 星座模型 为什么要对数据仓库分层?使用过 Hive 解析 JSON 串吗sort by 和 order by 的区别数据…

读书笔记之《机器与人》:AI如何重构工作方式和流程?

《机器与人: 埃森哲论新人工智能》作者是【美】保罗•多尔蒂和詹姆斯•威尔逊 ,原作名: Human Machine: Reimagining Work in the Age of AI,2018年出版。 保罗•多尔蒂(PAUL DAUGHERTYH):埃森哲首席技术官和创新官、…

策略迭代和价值迭代

策略迭代价值迭代 策略迭代(Policy Iteration)基本步骤例子:公主的营救 价值迭代(Value Iteration)基本步骤例子:公主的营救 策略迭代与价值迭代的区别实现方式目标收敛速度与其他技术的交互 策略迭代&…

浅谈Redis 的 保护模式(protected-mode)

今天在一台服务器上面部署了redis,发现始终无法用工具远程连接,项目里面是正常的,就是工具不行,防火墙也关闭了.折腾了一会才突然想起来,是不是触发了保护模式. 什么时候触发保护模式protected-mode: 同时满足以下两个: 1.bind未指定ip 2.未配置密码 解决方案: 编辑redis…

Room+ViewModel+LiveData

Room框架支持的LiveData会自动监听数据库的变化,当数据库发生变化的时候,会调用onChanged函数更新UI 1.MainActivity package com.tiger.room2;import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.vie…

红帽认证RHCE好考吗?多长时间能考下来?报名费多少一门?哪些人适合考红帽认证?

一、红帽认证等级 红帽认证考试有三个等级,分别是RHCSA(红帽认证系统管理员),RHCE(红帽认证工程师),RHCA(红帽认证架构师)。RHCA是最高级别的认证。 二、RHCE考试 1、考…

一款好用的AI工具——边界AICHAT(二)

目录 3.11、AI智能在线抠图3.12、AI智能图片增强放大3.13、AI图片擦除3.14、AI图片理解3.15、音频视频网页理解模型3.16、角色扮演3.17、AI文档理解对话3.18、公文写作模式3.19、插件库3.20、AI思维导图3.21、PPT一键生成3.22、音视频生成PPT 本篇博文接上一篇博文 一款好用的…

Singularity(四)| 自定义容器

Singularity(四)| 自定义容器 4.1 Singularity Definition 文件 对于可复制的、高质量的容器,我们应该使用定义文件(Definition File)构建 Singularity 容器 。使用定义文件的方式可以在纯文本文件中描述容器的配置和…

数据集踩的坑及解决方案汇总

数据集踩的坑及解决方案汇总 数据集各种格式构建并训练自己的数据集汇总Yolo系列SSDMask R-CNN报错 NotADirectoryError: [Errno 20] Not a directory: /Users/mia/Desktop/P-Clean/mask-RCNN/PennFudanPed2/labelme_json/.DS_StoreFaster R-CNN数据的格式转换划分数据集设定内…

移掉 K 位数字(LeetCode 402)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力法4.2 贪心 单调栈 参考文献 1.问题描述 给你一个以字符串表示的非负整数 num 和一个整数 k,移除这个数中的 k 位数字,使得剩下的整数最小。请你以字符串形式返回这个最小的整数。 示例 1 …

进电子厂了,感触颇多...

作者:三哥 个人网站:https://j3code.cn 本文已收录到语雀:https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的,真进电子厂了,但主人公不是我。 虽然我不是主人公,但是我经历的过程是和主…

Igraph入门指南 6

3、make_系列:igraph的建图工具 按照定义,正则图是指各顶点的度均相同的无向简单图,因为我目前没有找到描述度相等的有向(或自环图)的标准名称,所以在本文中借用一下这个概念,并加上定语有向无…

Android studio SDK Manager显示不全的问题解决

发现SDK Manager中只显示已下载的SDK版本,想下载其他版本下载不到,尝试翻墙也没用,修改host文件成功 在多个地点Ping服务器,网站测速 - 站长工具 输入dl.google.com,进行ping检测。 选择一个地址,比如180.163.150.1…

【深度学习笔记】5_12稠密连接网络(DenseNet)

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.12 稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

Python学习:基础语法

版本查看 python --version编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 特殊情况下,也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-标识符 第一个字符必须是字母表中字母或…

Java学习笔记------常用API

Math类 常用方法: 1. publicb static int abs(int a) 获取参数绝对值 2. publicb static double ceil(double a) 向上取整 3. publicb static floor(double a) 向下取整 4.public static int round(float a) 四舍五入 5. publicb static int max…

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中,可采用 redirect 来重定向到另一个地址: 通常是将 / 重定向到 某个页面; 示例展示: router/index.js:import { createRouter, createWebHashHistory, createWebHistory } from vue-route…