SPI与Springboot自动装配

目录

  • SPI
  • springboot的自动配置依赖于类似SPI的机制
  • Dubbo的SPI机制
  • SPI、双亲委派机制、线程上下文类加载器

SPI

SPI1,2是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性和灵活性的机制。引入服务提供者(也即SPI接口的实现者),通过本地的注册发现获取到具体的实现类,轻松可插拔。
e.g. , 使用mysql驱动应用了该机制:
在这里插入图片描述

我也亲自实操了一下:
在这里插入图片描述
如上图,在META_INF/services/com.secbro2.Subscribe文件里指定了两个实现类。
接口类Subscribe.java :

package com.secbro2;public interface Subscribe {void follow();
}

第一个实现类MySubscribe :

package com.secbro2;public class MySubscribe implements Subscribe {@Overridepublic void follow() {System.out.println("关注了 MySubscribe");}
}

第二个实现类OtherSubscribe :

package com.secbro2;public class OtherSubscribe implements Subscribe {public void follow() {System.out.println("关注了OtherSubscribe!");}
}

调用者:

package com.secbro2;import java.util.ServiceLoader;public class Call {public static void main(String[] args) {ServiceLoader<Subscribe> services = ServiceLoader.load(Subscribe.class);for (Subscribe sub : services) {sub.follow();}ServiceLoader<Parent> serviceLoader = ServiceLoader.load(Parent.class);for (Parent cl : serviceLoader) {cl.fun();}}
}
/** output:
关注了 MySubscribe
关注了OtherSubscribe!
Son1 fun
Son2 fun 
**/	

其中Parent与Son1,Son2相对于Subscribe.java等,只是把接口与实现类换成了类与其子类的关系,也是照样生效的。

springboot的自动配置依赖于类似SPI的机制

javaGuide—SpringBoot 自动装配原理详解—如何实现一个 Starter (尚未实操)和 springboot的自动配置原理及流程总结 的总结 :

通过@SpringBootConfiguration 引入了@EnableAuoConfiguration (负责启动自动配置功能)
@EnableAutoConfiguration 引入了@lmport
Spring容器启动时: 加载loc容器时会解析@Import注解
@lmport导入了一个DeferredlmportSelector(它会SpringBoot的自动配置类的顺序在最后,这样方便我们扩展和覆盖)
然后读取所有的/META-INF/spring.factories文件(SPI)
过滤出所有AutoConfigurtionClass类型的类
最后通过@ConditioonXXX排除无效的自动配置类

Dubbo的SPI机制

JavaGuide—Dubbo 常见面试题总结—Dubbo 的 SPI 机制了解么?

SPI、双亲委派机制、线程上下文类加载器

为什么有的人称SPI破坏了类加载器的双亲委派机制?
类加载器的双亲委派机制决定了可见性(visibility)。可见性原则允许子类加载器查看父类加载器加载的所有类,但父类加载器看不到子类加载器的类。3

java.sql.DriverManager通过扫包的方式拿到指定的实现类,完成 DriverManager的初始化。
但是,java.sql.DriverManager是启动类加载器加载的,根据可见性原则,启动类加载器加载的DriverManager不可能拿到应用类加载器加载的实现类 。3

为了解决这个困境,Java的设计团队只好引入了一个不太优雅的设计:线程上下文类加载器 (Thread Context ClassLoader)3

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD) 。。。我们会发现不是用的本类的加载器去加载的,而用线程上下文的加载器去加载的。。。会将AppClassloader放到上下文线程中,上面拿到的类加载器也就是这里的AppClassloader了。4


  1. 【mysql jdbc】SPI介绍及实例分析 ↩︎

  2. java菜鸟到大佬——全网最全java中SPI讲解 ↩︎

  3. 聊聊SPI机制以及为什么说SPI破坏了双亲委派模型 ↩︎ ↩︎ ↩︎

  4. 关于SPI打破双亲委派机制的一点见解 ↩︎

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

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

相关文章

js逆向补环境-b站志远二期最后8节课笔记

目录 一、基础知识1、什么是纯净V82、什么是BOM和DOM3、node环境/浏览器环境/V8引擎区别4、如何本地调试js补环境5、补环境相对于逆向算法的好处6、vm和vm2介绍 二、8个视频内容笔记概括1、补环境基本知识/头条案例手动插桩补2、Proxy代理/toString函数保护介绍3、补环境框架设…

PMP 3A备考指南

1、学习内容&#xff1a;如果上班能学习&#xff0c;上班学 慢慢悠悠3月 书过一遍 记大概框架&#xff0c;预测型记五大过程组 十大知识领域要知道为什么是这个过程 记为什么 死记打咩 看光环网课 有讲 老师很清楚明了 用上下班时间看 跟着老师思路走就行。敏捷直接看一遍视频&…

利用Adobe Acrobat DC实现图片和PDF互相转换

一、图片转PDF 可以实现多张或者单张图片转PDF! 这个需要使用到Adobe Acrobat DC的文件合并功能&#xff0c;因为Adobe Acrobat DC的文件合并&#xff0c;不仅可以合并多个pdf文件&#xff0c;也支持合并图片文件。 如图&#xff0c;直接选中多张图片合成即可&#xff1a; 添…

微信小程序上线与发布图文步骤操作

1.上传代码 打开微信小程序&#xff0c;在微信开发者工具的工具栏中单击“上传”按钮&#xff0c;页面中弹出提示框&#xff0c;根据提示填写相应的信息&#xff0c;然后单击“上传”按钮&#xff0c;即可上传代码。 2.查看上传代码之后的版本 登录微信小程序管理后台&…

数仓报表数据导出——Hive数据导出至Clickhouse

1. Clickhouse建表 创建database create database ad_report; use ad_report;创建table drop table if exists dwd_ad_event_inc; create table if not exists dwd_ad_event_inc (event_time Int64 comment 事件时间,event_type String comment 事件…

python爬虫_django+vue+echarts可视化查询所有CSDN用户质量分

文章目录 ⭐前言⭐ 效果⭐django简介⭐vue3简介⭐vue引入echarts ⭐前后分离实现&#x1f496; django代码层&#x1f496; vue3代码层结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前后分离djangovueecharts可视化查询CSDN用户质量分。 该系列文章&#…

Spring IoC及DI依赖注入

Spring 1.Spring的含义&#xff1a; Spring 可从狭义与广义两个角度看待 狭义的 Spring 是指 Spring 框架(Spring Fremework) 广义的 Spring 是指 Spring 生态体系 2.狭义的 Spring 框架 Spring 框架是企业开发复杂性的一站式解决方案 Spring 框架的核心是 IoC 容器和 AO…

LayUi之选项卡的详解(附源码讲解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.选项卡是什么 二.选项卡在什么时候使用…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

【云原生】· 一文了解docker中的网络

目录 &#x1f352;查看docker网络 &#x1f352;bridge网络 &#x1f352;none网络 &#x1f352;host网络 &#x1f352;自定义容器网络 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;云原生专栏 根据前面的学习&#xff0c;已经对d…

Qt/C++原创项目作品精选(祖传原创/性能凶残)

00 前言说明 从事Qt开发十年有余&#xff0c;一开始是做C#.NET开发的&#xff0c;因为项目需要&#xff0c;转行做嵌入式linux开发&#xff0c;在嵌入式linux上做可视化界面开发一般首选Qt&#xff0c;当然现在可选的方案很多比如安卓&#xff0c;但是十多年前那时候板子性能低…

服务器反向代理

反向代理作用 隐藏服务器信息 -> 保证内网的安全&#xff0c;通常将反向代理作为公网访问地址&#xff0c;web服务器是内网&#xff0c;即通过nginx配置外网访问web服务器内网 举例 百度的网址是&#xff1a;http://www.baidu.com &#xff0c; 现在我通过自己的服务器地…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上&#xff0c;但实事时类相互嵌套&#xff0c;非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

STM32基础知识点总结

一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多…

ChatGPT助力校招----面试问题分享(十一)

1 ChatGPT每日一题&#xff1a;PCB布线&#xff0c;高速信号线走直角的后果 问题&#xff1a;PCB布线&#xff0c;高速信号线走直角的后果 ChatGPT&#xff1a;对于高速信号线来说&#xff0c;最好避免使用直角布线。直角布线会引入反射和信号损耗&#xff0c;从而导致信号完…

【Python】selenium项目实战:从12306网站获取特定时间段二等座有票的车次

文章目录 一、项目背景二、页面查找1、查询条件2、定位有二等座的元素3、定位有二等座的车次信息4、CtrlF检验xpath查找的车次 三、代码实现 一、项目背景 工具&#xff1a; pythonpycharmselenium 12306网址&#xff1a; https://kyfw.12306.cn/otn/leftTicket/init?linktyp…

【云原生】Docker跨主机网络Overlay与Macvlan的区别

跨主机网络通信解决方案 docker原生的overlay和macvlan 第三方的flannel&#xff0c;weave&#xff0c;calico 1.overlay网络 在Docker中&#xff0c;Overlay网络是一种容器网络驱动程序&#xff0c;它允许在多个Docker主机上创建一个虚拟网络&#xff0c;使得容器可以通过这…

氢辉能源|[4GW]质子交换膜产线投产发布会暨[3MW]PEM电解槽正式交付

2023年7月12日下午&#xff0c;氢辉能源&#xff08;深圳&#xff09;有限公司&#xff08;以下简称氢辉能源&#xff09;质子交换膜产线投产发布会暨12台50标方3MW电解槽交付仪式在深圳市龙岗区国际低碳城成功举办。 此外&#xff0c;氢辉能源与远景能源、润世华集团、宏洲新能…

【MySQL】MySQL里程碑

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️MySQL】 文章目录 时间表从产品特性的角度梳理其发展过程中了解MySQL里程碑事件 时间表 从产品特性的角度梳理其发展过程中了解MySQL里程碑事件 1995年&#xff0c;MySQL 1.0发布&#xff0c;仅供内…

MongoDB负载均衡集群监控

对负载均衡的集群监控&#xff0c;不仅仅集中在对集群所有的资源、服务等进行监控&#xff0c;还要兼顾整体逻辑。以MongoDB高可用负载均衡集群为例&#xff0c;对逻辑层面的监控&#xff0c;就是模拟用户行为&#xff0c;访问集群数据&#xff0c;判断运行状态是否正常。 Mong…