`
bruce008
  • 浏览: 172860 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java SE 里面的 Service Loader 实现

    博客分类:
  • J2SE
 
阅读更多

在 Java SE 下面有一个不太常见的 ServiceLoader  类 , 它实现了java 中 的spi 机制。  所谓spi ( service provider interface) 就是java se 定义了很多 service 比如 logging,  xml parser, jdbc .  这些是所谓的标准, 比如 xml parser,  Oracle 会在 rt.jar 中提供一个标准的实现,但是第三方provider 可以提供各自的实现, 这样就需要一个机制去找到相应的实现。 我们都知道 IOC 的思想, 比如spring 我们通过XML 配置来指定具体的实现类。  

 

但是在Java SE 中没有IOC,  它又是怎么实现的呢? 答案就在这个ServiceLoader 类的实现中。

这个类只提供了 三个静态方法 :

   1,   public static <S> ServiceLoader<S> load(Class<S> service,   ClassLoader loader); 采用指定的classLoader 去load 相应的service 实现

   2,  public static  <S> ServiceLoader<S> load(Class<S> service); 采用当前线程的context class loader 去load service

   3,  public static <S> ServiceLoader<S> loadInstalled(Class<S> service); 这个比较特殊只会load JVM 下面 安装了的 serivce 实现。

   

    class loader  会去找   META-INF/services/ serviceName  的 resource,  找到这个文件 里面就是这个 service 相应实现的class 的类全名称。 当然这个class loader 在找这个 文件的时候遵从 class loader 的查找路径的, 一旦找到就 调用 Class.forName(cn, false, loader);

 

    这个ServiceLoader  还是用的很广泛的, 在比如 nio 的 FileSystems 里面;RMIClassLoader; 还有很多都用到它。

 

   另外很多比如XML parser,  JAXB 也都是采用类似这种方式 去找相应的 service factory 实现类工程, 然后调用相应的比如 JAXB 类工厂的 createContext 方法去创建 相应的 service 

 

   可以看出这个 ServiceLoader 的作用是大大的。

   

 

 

   

分享到:
评论

相关推荐

    Java Service Provider实现

    本文将围绕"Java Service Provider实现"这一主题,详细讲解其核心概念、工作原理以及如何使用。 一、SPI的工作原理 1. **配置文件**:SPI的核心是`META-INF/services/&lt;全限定接口名&gt;`格式的配置文件。在这个文件中...

    loader in java houtian

    标题“loader in java houtian”可能是指特定于某个项目或环境的Java加载器实现,但没有足够的上下文来详细讨论。在这里,我们将更普遍地探讨Java的类加载器和其工作原理。 1. **加载(Loading)**:这是类加载的第...

    MiniJavaVM—个Java虚拟机的设计和实现

    1. 加载器(Loader):负责将 Java 字节码加载到虚拟机中。 2. 解释器(Interpreter):负责将 Java 字节码翻译成机器码。 3. 执行引擎(Execution Engine):负责执行机器码。 4. 运行时数据区(Runtime Data Area...

    Java虚拟机规范(Java SE 7).7z

    Java SE 7(Java Standard Edition 7)是Java平台的一个重要版本,包含了对JVM的重大改进和新特性。本篇文章将深入探讨Java虚拟机在Java SE 7中的核心概念、改进和相关知识点。 一、JVM架构 JVM由以下几个关键组件...

    java3d loader +例子

    Java3D Loader是一种在Java环境中用于加载三维模型的工具,它极大地简化了开发者处理不同格式的3D模型文件的工作。标题中的"java3d loader +例子"表明我们将讨论如何使用这个工具以及它支持的多种模型格式,如DXF、...

    java 类加载器 class loader

    1. 启动类加载器(Bootstrap ClassLoader):它是JVM的一部分,由C++实现,负责加载JDK的根目录(rt.jar)中的核心类库,如java.lang.String等。 2. 扩展类加载器(Extension ClassLoader):加载JDK的`jre/lib/ext`...

    java SPI机制实现服务接口和服务实现分离源码Demo

    Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务实现。这种机制使得应用程序能够与多个第三方组件进行交互,而无需在编译时硬编码具体的实现类。SPI机制的...

    java spi实现工程

    Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务提供商。这个机制使得开发者可以扩展应用的功能,而无需修改原有代码。SPI的核心概念在于,服务接口由主程序...

    Fragment+Loader实现异步加载

    以"**MyFragLoaderTest**"为例,这个可能是测试项目或者一个具体的Fragment示例,它展示了如何在Fragment中使用Loader来实现异步加载。在这个测试中,开发者可能创建了一个自定义的Loader,用于从特定的数据源加载...

    Service Loader-开源

    Service Loader 是一个开源项目,主要用于在 Windows 操作系统中实现将应用程序作为服务来启动和管理。这种方式使得应用程序能够在系统启动时自动运行,并且可以像其他系统服务一样进行控制,例如启动、停止、暂停和...

    Linux下Boot Loader的设计与实现

    在讨论Linux下Boot Loader的设计与实现之前,我们需要对Boot Loader的概念有所了解。Boot Loader,也就是引导加载程序,是系统加电后运行的第一段软件代码,它的主要任务是初始化硬件设备、建立内存空间映射,将系统...

    java后台利用ffmpeg实现将视频截取某一帧图片并保存

    本教程将详细介绍如何在Java环境中利用FFmpeg库实现这一功能。 首先,`ffmpeg.jar`是Java版的FFmpeg封装,它提供了与FFmpeg命令行工具类似的接口,方便在Java程序中调用FFmpeg的功能。你需要先将这个JAR文件添加到...

    loaderrunner测试脚本

    4. **方法实现**: - **`init()`**:初始化方法,主要完成配置加载、登录等前置工作。 - **`action()`**:测试执行方法,控制整个测试流程。 - **`testChain()`**:测试链路方法,循环执行测试场景。 - **`...

    Java17module展示

    此项目展示了Java17里module的使用,最终打包为exe文件,不需要JDK环境 对应文章 https://burn-red.blog.csdn.net/article/details/131443199

    Java Class Loader总结.doc

    Java 类加载器(ClassLoader)是Java虚拟机的重要组成部分,它负责将Java字节码(.class文件)加载到JVM中并转化为`java.lang.Class`的实例,使得我们能够运行Java程序。Java的类加载机制遵循双亲委托模型,这是一种...

    使用JAVA中的动态代理实现数据库连接池

    ### 使用JAVA中的动态代理实现数据库连接池 在Java开发中,数据库连接管理是十分关键的一环,尤其是在高并发场景下,合理的连接管理可以显著提升应用性能。本文将详细介绍如何使用Java中的动态代理技术来实现一个...

    java class loader(JAVA类加载器)

    理解类加载器的工作原理对于深入学习Java平台、优化应用程序性能以及实现自定义加载器至关重要。 1. **类加载器层次结构** Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...

    swoole-loader.zip

    4. **自定义加载逻辑**:如果需要更复杂的加载逻辑,可以通过实现`Swoole\Loader\LoaderInterface`接口来自定义类库加载器。 5. **性能优化**:Swoole-Loader的性能优化关键在于合理规划类库结构和命名空间,避免...

    Java获取接口所有实现类的方式详解

    Java获取接口所有实现类的方式详解 Java 获取接口所有实现类的方式详解是 Java 编程中的一种常见需求。在实际项目中,我们经常需要获取某个接口的所有实现类,以便于实现业务逻辑的需求。对于这个问题,Java 提供...

Global site tag (gtag.js) - Google Analytics