最新要闻
- 每日看点!Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例
- 世界短讯!让人欣慰?老外呼吁热门IP都应改为黑人:受社会尊重 改变低人一等形象
- 视焦点讯!杭州一居民家门口地面有80℃ 热到烫脚:挖2小时后找到原因 网友称好险
- 环球快报:2023年最新辽宁省直住房公积金缴费基数是多少
- 新款Mac Pro现身跑分平台:M2 Ultra处理器 频率3.68 GHz
- 1.4kg重量就做到900ANSI流明!哈趣H2投影仪评测:旅行能用充电宝供电|每日报道
- 关注:不如隔壁New Bing:谷歌搜索AI功能被吐槽反应太慢
- 当前速讯:2023高考即将来临 应该怎么吃?专家科普:避免5个忌讳
- 50年前美国登月真的造假吗?日本将第三次挑战登月 证实可能性
- 苹果(AAPL.US)本周将举办开发者大会 首款头显终将亮相 环球快播报
- 取代手机不是吹!Win11原生运行安卓APP体验大升级:便捷丝滑-全球资讯
- 全球快看点丨乘客雨中候车 高铁站台为什么不能打伞上热搜:官方说明
- 两位国人男子放弃登顶珠峰花1万美元救人 获救女子只愿承担4成救援费 天天新消息
- 小鹏G6官宣神秘代言人:网友纷纷猜是林志颖! 环球资讯
- 世界今日讯!全脂/低脂可选:特仑苏纯牛奶2.7元/盒发车(商超6元)
- 两元人民币图片 两元人民币_每日速讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日看点!Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例
在当今互联网时代,应用程序越来越复杂,对于我们开发人员来说,如何实现高效的组件化和模块化已经成为了一个重要的问题。而Java SPI(Service Provider Interface)机制,作为一种基于接口的服务发现机制,可以帮助我们更好地解决这个问题。这样会程序具有高度的灵活性、解耦、可扩展性!
在本篇博客中,我们将深入探讨Java SPI 的概念、实现原理、优缺点、应用场景和使用步骤,并通过实战演示来说明如何使用 Java SPI 实现各种功能。无论您是刚刚接触 Java SPI 还是已经有一定经验的开发者,本篇博客都能为您提供有益的指导和建议。
(资料图)
「对你有帮助,还请动动发财小手点点关注哈!」
二、概念和实现原理1、概念Java SPI(Service Provider Interface)是Java官方提供的一种服务发现机制,它允许在运行时动态地加载实现特定接口的类,而不需要在代码中显式地指定该类,从而实现解耦和灵活性。
可以看一下机制图:
2、实现原理Java SPI 的实现原理基于Java 类加载机制和反射机制。
当使用ServiceLoader.load(Class
在加载类之后,ServiceLoader会通过反射机制创建对应类的实例,并将其缓存起来。
这里涉及到一个「懒加载迭代器」的思想:
当我们调用ServiceLoader.load(Class
「只有在使用迭代器遍历时,才会按需加载对应的类并创建其实例。」
这种懒加载思想有以下两个好处:
节省内存如果一次性将所有实现类全部加载进来,可能会导致内存占用过大,影响程序的性能。增强灵活性由于 ServiceLoader 是动态加载的,因此可以在程序运行时添加或删除实现类,而无需修改代码或重新编译。总的来说,Java SPI 的实现原理比较简单,利用了Java 类加载和反射机制,提供了一种轻量级的插件化机制,可以很方便地扩展功能。
三、优缺点1、优点松耦合性:SPI具有很好的松耦合性,应用程序可以在运行时动态加载实现类,而无需在编译时将实现类硬编码到代码中。扩展性:通过SPI,应用程序可以为同一个接口定义多个实现类。这使得应用程序更容易扩展和适应变化。易于使用:使用SPI,应用程序只需要定义接口并指定实现类的类名,即可轻松地使用新的服务提供者。2、缺点配置较麻烦:SPI需要在META-INF/services目录下创建配置文件,并将实现类的类名写入其中。这使得配置相对较为繁琐。安全性不足:SPI提供者必须将其实现类名称写入到配置文件中,因此如果未正确配置,则可能存在安全风险。性能损失:每次查找服务提供者都需要重新读取配置文件,这可能会增加启动时间和内存开销。四、应用场景Java SPI机制是一种服务提供者发现的机制,适用于需要在多个实现中选择一个进行使用的场景。
常见的应用场景包括:
应用名称 | 具体应用场景 |
数据库驱动程序加载 | JDBC为了实现可插拔的数据库驱动,在Java.sql.Driver接口中定义了一组标准的API规范,而具体的数据库厂商则需要实现这个接口,以提供自己的数据库驱动程序。在Java中,JDBC驱动程序的加载就是通过SPI机制实现的。 |
日志框架的实现 | 流行的开源日志框架,如Log4j、SLF4J和Logback等,都采用了SPI机制。用户可以根据自己的需求选择合适的日志实现,而不需要修改代码。 |
Spring框架 | Spring框架中的Bean加载机制就使用了SPI思想,通过读取classpath下的META-INF/spring.factories文件来加载各种自定义的Bean。 |
Dubbo框架 | Dubbo框架也使用了SPI思想,通过接口注解@SPI声明扩展点接口,并在classpath下的META-INF/dubbo目录中提供实现类的配置文件,来实现扩展点的动态加载。 |
MyBatis框架 | MyBatis框架中的插件机制也使用了SPI思想,通过在classpath下的META-INF/services目录中存放插件接口的实现类路径,来实现插件的加载和执行。 |
Netty框架 | Netty框架也使用了SPI机制,让用户可以根据自己的需求选择合适的网络协议实现方式。 |
Hadoop框架 | Hadoop框架中的输入输出格式也使用了SPI思想,通过在classpath下的META-INF/services目录中存放输入输出格式接口的实现类路径,来实现输入输出格式的灵活配置和切换。 |
我们上面对Java SPI的缺点说了一下,我们来说一下:Spring的SPI机制相对于Java原生的SPI机制进行了改造和扩展,主要体现在以下几个方面:
支持多个实现类:Spring的SPI机制允许为同一个接口定义多个实现类,而Java原生的SPI机制只支持单个实现类。这使得在应用程序中使用Spring的SPI机制更加灵活和可扩展。支持自动装配:Spring的SPI机制支持自动装配,可以通过将实现类标记为Spring组件(例如@Component),从而实现自动装配和依赖注入。这在一定程度上简化了应用程序中服务提供者的配置和管理。支持动态替换:Spring的SPI机制支持动态替换服务提供者,可以通过修改配置文件或者其他方式来切换服务提供者。而Java原生的SPI机制只能在启动时加载一次服务提供者,并且无法在运行时动态替换。提供了更多扩展点:Spring的SPI机制提供了很多扩展点,例如BeanPostProcessor、BeanFactoryPostProcessor等,可以在服务提供者初始化和创建过程中进行自定义操作。其他框架也是对Java SPI进行改造和扩展增强,从而更好的提供服务!
五、使用步骤定义接口:首先需要定义一个接口,所有实现该接口的类都将被注册为服务提供者。创建实现类:创建一个或多个实现接口的类,这些类将作为服务提供者。配置文件:在 META-INF/services 目录下创建一个以接口全限定名命名的文件,文件内容为实现该接口的类的全限定名,每个类名占一行。加载使用服务:使用 java.util.ServiceLoader 类的静态方法 load(Classservice) 加载服务,默认情况下会加载 classpath 中所有符合条件的提供者。调用 ServiceLoader 实例的 iterator() 方法获取迭代器,遍历迭代器即可获取所有实现了该接口的类的实例。使用 Java SPI 时,需要「注意以下几点」:
「接口必须是公共的,且只能包含抽象方法。」「实现类必须有一个无参构造函数。」「配置文件中指定的类必须是实现了相应接口的非抽象类。」「配置文件必须放在 META-INF/services 目录下。」「配置文件的文件名必须为接口的全限定名。」六、练手例子上面我们知道使用步骤,现在我们就开始自己实现一个SPI!
1、定义接口我们定义一个编程语言的接口!
/** * @author wangzhenjun * @date 2023/5/31 15:33 */public interface ProgrammingLanguageService { /** * 学习方法 */ void study();}
2、创建实现类我们创建两个实现类,简单模拟一下!简单的输出一句话!
Java实现:
/** * @author wangzhenjun * @date 2023/5/31 15:34 */public class JavaServiceImpl implements ProgrammingLanguageService { @Override public void study() { System.out.println("开始学习Java!!"); }}
Python实现:
/** * @author wangzhenjun * @date 2023/5/31 15:34 */public class PythonServiceImpl implements ProgrammingLanguageService { @Override public void study() { System.out.println("开始学习Python!!"); }}
3、配置文件我们创建两个文件夹:META-INF、services,在创建一个普通文件即可:com.example.demo.service.ProgrammingLanguageService。
注意:一定是接口的类的全限定名。
com.example.demo.service.impl.JavaServiceImplcom.example.demo.service.impl.PythonServiceImpl
4、加载使用服务/** * @author wangzhenjun * @date 2023/5/31 13:46 */public class ServiceLoaderTest { public static void main(String[] args) { ServiceLoader serviceLoader = ServiceLoader.load(ProgrammingLanguageService.class); Iterator iterator = serviceLoader.iterator(); while (iterator.hasNext()) { ProgrammingLanguageService service = iterator.next(); service.study(); } }}
这样一个简单的练手项目就搞定了,小伙伴们有没有成功呢!
七、总结在本文中,我们深入探讨了「Java SPI的概念、实现原理、优缺点、应用场景、使用步骤以及实战SPI实现」。通过学习SPI,我们可以充分利用Java的动态扩展机制,实现插件化开发和可扩展性架构。
同时,我们也了解到SPI在多个领域中具有很广泛的应用,包括「日志、数据库、框架」等方面。要使用SPI,需要遵循一定的规范和标准,例如META-INF/services目录下的配置文件。最后,我们通过一个简单的示例,详细演示了如何实现自己的SPI接口,并动态加载不同的实现类。
希望本文能够帮助读者深入理解Java SPI的相关知识,提高技术水平和实践能力。
关键词:
每日看点!Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例
世界短讯!让人欣慰?老外呼吁热门IP都应改为黑人:受社会尊重 改变低人一等形象
视焦点讯!杭州一居民家门口地面有80℃ 热到烫脚:挖2小时后找到原因 网友称好险
.NET使用System.Speech轻松读取文本
环球快报:2023年最新辽宁省直住房公积金缴费基数是多少
新款Mac Pro现身跑分平台:M2 Ultra处理器 频率3.68 GHz
1.4kg重量就做到900ANSI流明!哈趣H2投影仪评测:旅行能用充电宝供电|每日报道
关注:不如隔壁New Bing:谷歌搜索AI功能被吐槽反应太慢
当前速讯:2023高考即将来临 应该怎么吃?专家科普:避免5个忌讳
50年前美国登月真的造假吗?日本将第三次挑战登月 证实可能性
苹果(AAPL.US)本周将举办开发者大会 首款头显终将亮相 环球快播报
2023陕西省大学生信息安全竞赛web writeup
世界速看:MySQL字符集与校对集规则说明
Linux环境安装JDK-焦点精选
取代手机不是吹!Win11原生运行安卓APP体验大升级:便捷丝滑-全球资讯
全球快看点丨乘客雨中候车 高铁站台为什么不能打伞上热搜:官方说明
两位国人男子放弃登顶珠峰花1万美元救人 获救女子只愿承担4成救援费 天天新消息
小鹏G6官宣神秘代言人:网友纷纷猜是林志颖! 环球资讯
世界今日讯!全脂/低脂可选:特仑苏纯牛奶2.7元/盒发车(商超6元)
两元人民币图片 两元人民币_每日速讯
今日美股市场行情快报(2023年6月5日)
《计算机网络》——华为基本配置命令_焦点热讯
700多心理测试性格测试大全ACCESS数据库 每日讯息
天天热资讯!帮你梳理了一份前端知识架构图
天天速读:亚马逊网络服务教程_编程入门自学教程_菜鸟教程-免费教程分享
今日热闻!hw面试常见中间件漏洞
特斯拉超充站充电 吃完饭下来“罚款”500!车主:这辈子不再买它了 当前热闻
XGP故障、键鼠无响应:Win11更新又出大量问题|天天快看
全球观点:明天出坞!我国首艘国产大型邮轮“爱达·魔都”内部实拍:可容纳5246人
经典重现!梁家辉把玩马自达CX-50行也车模 网友:别坐、堵车 世界百事通
微动态丨大众全新入门级轿车 朗逸XR即将上市!代替桑塔纳 或售5-7万
要闻速递:港股开盘 | 恒指高开0.34% 科网股表现分化 机构:三大因素支撑港股反弹
世界视点!SpringBoot打包成WAR包的时候把第三方jar包打到LIB文件夹下和把第三方jar包打入到SpringBoot jar包中
首批网红明星AI克隆人上线,花30元可与知名网红视频聊天
行驶中方向盘可能会掉 特斯拉召回部分Model Y!中国车主不受影响 前沿资讯
环球百事通!微软Office 365 AI定价曝光:年费10万美元 已有100家客户
反向带货 长安汽车4S直播间上演“尾翼夹手”:女销售惨叫不已_全球热文
宝骏悦也后装增程版方案出炉:4L油箱多跑80km、售价2000元-全球热推荐
人才!顾客打印身份证后怕泄露隐私 顺手把老板电脑系统重装了
6月5日最新秘鲁鱼粉外盘价格
AVX512惹麻烦 英特尔大小核给AMD上了一课 Zen5锐龙吸取教训
苹果首款头显明天发布!郭明錤泼冷水:类ChatGPT更重要
日本车的又一个基本盘:要崩了 天天看热讯
世界快报:全球首架载人“飞碟”在深圳起飞:水陆两栖起降 最快50km/h
变阵!热火总决赛G2首发:乐福顶替马丁出任首发!
每日动态!Blazor 使用代码直接在新窗口打开链接, 获取窗口宽度, 使用cookie
如何在Linux上启用 Nginx 的 HTTP/2 协议支持-聚看点
【读财报】公募REITs透视:建信、中金基金年内回撤逾15% 华安、博时基金等启动首批扩募
关于开通招商智星稳健配置混合型基金中基金(FOF-LOF)A类份额跨系统转托管业务的公告_环球时讯
国产大飞机C919商业首飞圆满成功:国产化率60% 年产能将达50架|全球通讯
顺利交付!神十五航天员带回了20多公斤实验样品:竟有一种虫子_最资讯
10年前的显卡都流畅 《暗黑4》被曝移植苹果平台:iPad也能玩_环球快报
还说4G成熟够用?中国网速全面秒美国 邬贺铨:总用户数激增 向5.5G发展
全球快资讯:读改变未来的九大算法笔记04_公钥加密
孩子严重烫伤9天才被家长送医 听偏方治疗:据给孩子手术 网友无语
SSD硬盘暴跌 你仍然需要一块机械硬盘:存数据更安全-世界短讯
实时:河南一村庄修路挖出大石龟?官方通报:上世纪修路埋的
柘汪中学:青少年科技教育成果丰硕
【DNS】域名服务 Bind实现
ASP.NET Core MVC 从入门到精通之自动映射(二)-独家焦点
实时焦点:不是我说 iPhone拍照怎么就像富士相机了?
世界热推荐:NVIDIA黄仁勋:我们从未忘记游戏玩家!
号称使用AI独立管理基金的私募改口了:AI并非主要用于交易 热点
人间第一情歌词完整版原唱_人间第一情歌词|全球看热讯
实时焦点:今金贷最新退付消息:2023年兑付最新声明退付通知(退付进展告知)
曝华为版ChatGPT将下月发布 名为“盘古Chat”-当前独家
每日热议!128秒回顾中国载人航天高燃时刻:杨利伟 居功至伟!
【环球报资讯】假鸡翅怎么做法?
Web安全-渗透测试-基础知识02
Web安全-渗透测试-基础知识01-环球视点
撼迅AMD显卡抹错硅脂 温度高达110℃!曝生产线自证清白
MPV无敌手 比亚迪赵长江:腾势D9月销将达1.5万-每日看点
专访:美国没有资格充当民主人权教师爷——访俄政治学家米尔扎扬-世界热消息
可提速400公里!成渝中线高铁两大隧道同时进洞
天涯老用户自救 结果一地鸡毛:情怀 是最不值钱的东西
24点结束 腾讯视频VIP年卡+京东PLUS年卡138元 环球热门
十字军东征——现代社会可能重演吗?
文心一言 VS 讯飞星火 VS chatgpt (31)-- 算法导论5.2 3题 全球简讯
【奶奶看了都会】云服务器ChatGLM模型fine-tuning微调,让你拥有自己的知识库|世界动态
京东手机金榜出炉:Redmi K60力压iPhone 14夺冠
韧性回弹 脚感澎湃 361°运动拖鞋63元狂促(门店159元)-实时
真正的国产显卡之光!摩尔线程国产GPU、AI与元宇宙多项进展深入解读
中国铁塔:每天为近百万外卖和快递小哥提供换电充电服务
h2o2摩尔质量_h2o2
抢收同时抢种,河南已完成夏播2340万亩
华擎又出妖板!迷你身材 塞进去128个Arm核心 环球热资讯
多国出现人类偏肺病毒感染 一年1.6万儿童死亡!尚无治疗药物
自我的创建
ASP.NET Core 全局异常处理 世界热资讯
世界热门:(ex)BSGS/(扩展)大步小步算法 学习笔记
机会越来越好-与君周末谈20230604
虚幻5国漫巅峰 《斗罗大陆》比比东成神 巨型镰刀秒杀唐三
甚至没动工!《赛博朋克2077》续作明年才将投入开发 播资讯
我的脸被隐翅虫毁容了!千万小心“会飞的硫酸”
积成电子:预中标1.05亿元国家电网采购项目_世界新消息
全球微资讯!时速133严重车祸 车主:感谢驱逐舰05救我一命 又买了辆比亚迪汉
环球热文:马斯克北京首日晚宴多少钱?22人“吃”掉4.5万元
Web安全-渗透测试-基础知识01 世界播资讯
【天天速看料】Leetcode 1156. 单字符重复子串的最大长度
CPU的功能是什么_cpu的主要功能