`
pengjianf_ah
  • 浏览: 8563 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java spi 学习记录

spi 
阅读更多
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
0
0
分享到:
评论

相关推荐

    java SPI的jar包

    这个资源是我的博客《java SPI机制学习笔记》中的提供服务的jar包

    spi,Android组件化的SPI。.zip

    4. **AOP(面向切面编程)**:SPI机制也常与AOP结合,通过拦截器模式实现对服务调用的增强,如日志记录、性能监控等。 5. **依赖注入**:类似于Dagger或Koin这样的依赖注入框架,可以通过注解和反射实现服务的自动...

    深入学习Java中的SPI机制

    "深入学习Java中的SPI机制" Java中的SPI(Service Provider Interface)机制是一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。SPI机制的主要思想是将装配的控制权移到程序...

    java sound学习资料

    ### Java Sound API 学习资料知识点详述 #### 一、Java Sound API 体系结构 Java Sound API 是 Java 平台上处理音频的核心组件之一,它为开发者提供了丰富的工具集,以便于开发各种基于声音的应用程序,例如声音...

    dubbo-thought.7z

    4. 文档:可能包含了一些学习笔记或者教程,解释了如何配置和使用Dubbo SPI。 通过这个项目,你可以深入理解Java SPI和Dubbo SPI的区别,学习如何在实际项目中应用Dubbo的扩展机制。这对于提升Java开发者,特别是...

    java 类加载器学习笔记1

    2. **上下文类加载机制**:主要应用于Service Provider Interface (SPI)中,允许应用程序在运行时动态发现和加载服务提供者。 了解类加载器的工作原理对优化Java应用、实现定制化加载策略以及理解JVM行为至关重要。...

    java API文档

    - **java.util.logging**:日志记录支持。 - **java.util.prefs**:用户偏好设置支持。 - **java.util.regex**:正则表达式支持。 - **java.util.spi**:服务提供者接口支持。 - **java.util.zip**:ZIP压缩和...

    Java认证和授权服务笔记代码

    Java认证和授权服务(Java Authentication and Authorization Service,简称JAAS)是Java平台提供的一种安全机制,用于处理用户身份验证和权限管理。...学习并掌握JAAS,是提升Java安全编程能力的重要一步。

    基于Java的mp3播放器源代码

    【标题】基于Java的mp3播放器源...总的来说,这个基于Java的MP3播放器项目涵盖了多媒体编程、事件驱动编程、软件设计原则等多个IT知识点,对于学习Java编程和多媒体应用开发的初学者来说,是一个非常有价值的实践案例。

    java 音乐盒系统源码

    Java的JMF(Java Media Framework)或者更现代的库如JLayer和MP3SPI可能被用来处理音频文件的解码。此外,系统还需要支持基本的播放控制,如播放、暂停、停止、快进、后退以及音量调节。 7. **用户界面设计** 用户...

    用Java实现音频播放

    同时,通过服务提供者接口(SPI)`java.sound.sampled.spi`和`javax.sound.midi.spi`,开发者可以编写插件以扩展JavaSound的功能,实现对不同音频格式的支持,例如添加MP3解码功能。 **混频原理** JavaSound中的...

    java温度检测仪语音图示系统

    这些传感器能将物理温度转换为数字信号,然后通过I2C、UART或SPI等通信协议传输到微控制器。Java程序通过特定的驱动库与这些传感器进行交互,读取并处理温度数据。 2. **语音提示**:系统内置的语音模块可以将温度...

    SCA学习笔记

    SCA学习笔记 本文档为SCA学习笔记,主要介绍了SCA(Service Component Architecture)的概念、实现和应用,特别是与Web 2.0技术的结合。SCA是一种SOA(Service-Oriented Architecture)编程模型,能够帮助企业级...

    Log4j的学习笔记

    **Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录工具,由Apache软件基金会开发。它提供了一种灵活且强大的机制来记录应用的运行情况,这对于调试、性能分析、问题追踪以及系统监控至关重要。这篇学习...

    JAVA 媒体框架基础 教程

    Java媒体框架基础教程 在Java开发中,处理多媒体数据,如音频、视频和图像,是一项重要的任务。Java Media Framework(JMF)就是这样一个为开发者提供强大支持的平台,它允许程序处理各种媒体类型,实现播放、捕获...

    CSS样式 JS特效 Java小工具 文学文档 Java插件 截图软件

    开发Java插件需要理解Java的反射机制、SPI(Service Provider Interface)以及插件系统的设计原理。 “截图软件”是指能够捕捉屏幕图像的工具,它们通常包含多种截图模式,如全屏、窗口、矩形区域等。开发截图软件...

    嵌入式题库,学习笔记,应用题库

    在“嵌入式题库,学习笔记,应用题库”中,我们可以找到一系列关于这个领域的学习资源,涵盖了理论知识和实践应用。 嵌入式系统是嵌入在各种设备中的计算机系统,它们可能在汽车、家用电器、医疗设备、移动电话等中...

    jdbc-interface.zip_Aglet_java aglet_jdbc

    在JDBC连接中,如果驱动是JAR文件,那么META-INF目录也可能会包含服务提供者接口(SPI)的注册信息,让Java知道如何找到并加载特定的JDBC驱动。 结合这些文件,我们可以推测这个压缩包是一个示例项目,演示了如何在...

    matlab计算SPI的代码-code-snippets-hardware:RPi(SPI),Arduino(GPRS),VideoRecor

    VideoRecorder(Java):视频记录,来自网络摄像机或外部USB摄像机的实时流的图像捕获。 (旧代码,多个错误)。 只是学习Java的练习代码。 胎儿心率:与MATLAB脚本一起使用的数据,可通过孕妇腹部ECG预测胎儿心率。...

Global site tag (gtag.js) - Google Analytics