SPI 说明:
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现,
简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现【可不是说程序跑起来你换个jar就会动态选择实现类】。
主要用途:模块之前完全解耦合【比如服务定义A 服务实现A1/服务实现A2 某一程序使用A服务,代码里面不需要写new A1() 或者new A2(),不想用的话,只需要从类路径异常想用的jar或者添加想用的jar包】
jdbc就是基于这块实现....
编写代码需要满足什么条件才可以使用?
1.定义接口
2.各种服务实现
3.关键:在实现类的jar中添加:META-INF/services/接口包名.接口名称 文件内容:实现类的包名.实现类的名称
4.访问...见代码
1.定义接口
package com.learn.interfaces;
public interface SaveDataInterface {
/**
* 只是一个save方法,让其他模块去实现
* @param msg
*/
void save(String msg);
}
2.各种实现
package com.learn.service.save.imps;
import com.learn.interfaces.SaveDataInterface;
public class FileSaveDataSaveImpl implements SaveDataInterface {
public void save(String msg) {
System.out.println("==========FileSave=============");
System.out.println("文件方式保存,实现方式,请求参数:"+msg);
System.out.println("==========FileSave=============");
}
}
package com.learn.service.db;
import com.learn.interfaces.SaveDataInterface;
public class DbSaveDataImpl implements SaveDataInterface{
public void save(String msg) {
System.out.println("==========DbSave=============");
System.out.println("数据库方式保存,实现方式,请求参数:"+msg);
System.out.println("==========DbSave=============");
}
}
3.关键(贴图)【不一一贴了】
4.访问
package com.test;
import java.util.Iterator;
import java.util.ServiceLoader;
import com.learn.interfaces.SaveDataInterface;
public class TestForSpi {
public static void main(String[] args) {
ServiceLoader<SaveDataInterface> serviceLoader = ServiceLoader.load(SaveDataInterface.class);
Iterator<SaveDataInterface> imps = serviceLoader.iterator();
SaveDataInterface imp;
while (imps.hasNext()) {
imp = imps.next();
imp.save("test");
}
}
}
运行结果
==========DbSave=============
数据库方式保存,实现方式,请求参数:test
==========DbSave=============
==========FileSave=============
文件方式保存,实现方式,请求参数:test
==========FileSave=============
----------------------------------------------
---------整体代码间附件learnspi.zip
缺点:
根据文件中配置实例类,全部实例化,占用不必要的内存,
个人觉得:提供接口后,后面各个厂商的实现,各个厂商实现即可,也不会闲着没有瞎弄多个吧,不算缺点吧
这块的源码分析可以看看
https://www.jianshu.com/p/a6073e9f8cb4,文档分析的很好!!!
跟了一下:根据接口名称去类路径找文件(含jar),找到相应的文件,读取内容,里面的配置即为实现类,根据class.for....来实例化,需要有默认的构造器
- 大小: 117.4 KB
分享到:
相关推荐
这个资源是我的博客《java SPI机制学习笔记》中的提供服务的jar包
4. **AOP(面向切面编程)**:SPI机制也常与AOP结合,通过拦截器模式实现对服务调用的增强,如日志记录、性能监控等。 5. **依赖注入**:类似于Dagger或Koin这样的依赖注入框架,可以通过注解和反射实现服务的自动...
"深入学习Java中的SPI机制" Java中的SPI(Service Provider Interface)机制是一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。SPI机制的主要思想是将装配的控制权移到程序...
### Java Sound API 学习资料知识点详述 #### 一、Java Sound API 体系结构 Java Sound API 是 Java 平台上处理音频的核心组件之一,它为开发者提供了丰富的工具集,以便于开发各种基于声音的应用程序,例如声音...
4. 文档:可能包含了一些学习笔记或者教程,解释了如何配置和使用Dubbo SPI。 通过这个项目,你可以深入理解Java SPI和Dubbo SPI的区别,学习如何在实际项目中应用Dubbo的扩展机制。这对于提升Java开发者,特别是...
2. **上下文类加载机制**:主要应用于Service Provider Interface (SPI)中,允许应用程序在运行时动态发现和加载服务提供者。 了解类加载器的工作原理对优化Java应用、实现定制化加载策略以及理解JVM行为至关重要。...
- **java.util.logging**:日志记录支持。 - **java.util.prefs**:用户偏好设置支持。 - **java.util.regex**:正则表达式支持。 - **java.util.spi**:服务提供者接口支持。 - **java.util.zip**:ZIP压缩和...
Java认证和授权服务(Java Authentication and Authorization Service,简称JAAS)是Java平台提供的一种安全机制,用于处理用户身份验证和权限管理。...学习并掌握JAAS,是提升Java安全编程能力的重要一步。
【标题】基于Java的mp3播放器源...总的来说,这个基于Java的MP3播放器项目涵盖了多媒体编程、事件驱动编程、软件设计原则等多个IT知识点,对于学习Java编程和多媒体应用开发的初学者来说,是一个非常有价值的实践案例。
Java的JMF(Java Media Framework)或者更现代的库如JLayer和MP3SPI可能被用来处理音频文件的解码。此外,系统还需要支持基本的播放控制,如播放、暂停、停止、快进、后退以及音量调节。 7. **用户界面设计** 用户...
同时,通过服务提供者接口(SPI)`java.sound.sampled.spi`和`javax.sound.midi.spi`,开发者可以编写插件以扩展JavaSound的功能,实现对不同音频格式的支持,例如添加MP3解码功能。 **混频原理** JavaSound中的...
这些传感器能将物理温度转换为数字信号,然后通过I2C、UART或SPI等通信协议传输到微控制器。Java程序通过特定的驱动库与这些传感器进行交互,读取并处理温度数据。 2. **语音提示**:系统内置的语音模块可以将温度...
SCA学习笔记 本文档为SCA学习笔记,主要介绍了SCA(Service Component Architecture)的概念、实现和应用,特别是与Web 2.0技术的结合。SCA是一种SOA(Service-Oriented Architecture)编程模型,能够帮助企业级...
**Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录工具,由Apache软件基金会开发。它提供了一种灵活且强大的机制来记录应用的运行情况,这对于调试、性能分析、问题追踪以及系统监控至关重要。这篇学习...
Java媒体框架基础教程 在Java开发中,处理多媒体数据,如音频、视频和图像,是一项重要的任务。Java Media Framework(JMF)就是这样一个为开发者提供强大支持的平台,它允许程序处理各种媒体类型,实现播放、捕获...
开发Java插件需要理解Java的反射机制、SPI(Service Provider Interface)以及插件系统的设计原理。 “截图软件”是指能够捕捉屏幕图像的工具,它们通常包含多种截图模式,如全屏、窗口、矩形区域等。开发截图软件...
在“嵌入式题库,学习笔记,应用题库”中,我们可以找到一系列关于这个领域的学习资源,涵盖了理论知识和实践应用。 嵌入式系统是嵌入在各种设备中的计算机系统,它们可能在汽车、家用电器、医疗设备、移动电话等中...
在JDBC连接中,如果驱动是JAR文件,那么META-INF目录也可能会包含服务提供者接口(SPI)的注册信息,让Java知道如何找到并加载特定的JDBC驱动。 结合这些文件,我们可以推测这个压缩包是一个示例项目,演示了如何在...
VideoRecorder(Java):视频记录,来自网络摄像机或外部USB摄像机的实时流的图像捕获。 (旧代码,多个错误)。 只是学习Java的练习代码。 胎儿心率:与MATLAB脚本一起使用的数据,可通过孕妇腹部ECG预测胎儿心率。...