在 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实现"这一主题,详细讲解其核心概念、工作原理以及如何使用。 一、SPI的工作原理 1. **配置文件**:SPI的核心是`META-INF/services/<全限定接口名>`格式的配置文件。在这个文件中...
标题“loader in java houtian”可能是指特定于某个项目或环境的Java加载器实现,但没有足够的上下文来详细讨论。在这里,我们将更普遍地探讨Java的类加载器和其工作原理。 1. **加载(Loading)**:这是类加载的第...
1. 加载器(Loader):负责将 Java 字节码加载到虚拟机中。 2. 解释器(Interpreter):负责将 Java 字节码翻译成机器码。 3. 执行引擎(Execution Engine):负责执行机器码。 4. 运行时数据区(Runtime Data Area...
Java SE 7(Java Standard Edition 7)是Java平台的一个重要版本,包含了对JVM的重大改进和新特性。本篇文章将深入探讨Java虚拟机在Java SE 7中的核心概念、改进和相关知识点。 一、JVM架构 JVM由以下几个关键组件...
Java3D Loader是一种在Java环境中用于加载三维模型的工具,它极大地简化了开发者处理不同格式的3D模型文件的工作。标题中的"java3d loader +例子"表明我们将讨论如何使用这个工具以及它支持的多种模型格式,如DXF、...
1. 启动类加载器(Bootstrap ClassLoader):它是JVM的一部分,由C++实现,负责加载JDK的根目录(rt.jar)中的核心类库,如java.lang.String等。 2. 扩展类加载器(Extension ClassLoader):加载JDK的`jre/lib/ext`...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务实现。这种机制使得应用程序能够与多个第三方组件进行交互,而无需在编译时硬编码具体的实现类。SPI机制的...
Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务提供商。这个机制使得开发者可以扩展应用的功能,而无需修改原有代码。SPI的核心概念在于,服务接口由主程序...
以"**MyFragLoaderTest**"为例,这个可能是测试项目或者一个具体的Fragment示例,它展示了如何在Fragment中使用Loader来实现异步加载。在这个测试中,开发者可能创建了一个自定义的Loader,用于从特定的数据源加载...
Service Loader 是一个开源项目,主要用于在 Windows 操作系统中实现将应用程序作为服务来启动和管理。这种方式使得应用程序能够在系统启动时自动运行,并且可以像其他系统服务一样进行控制,例如启动、停止、暂停和...
在讨论Linux下Boot Loader的设计与实现之前,我们需要对Boot Loader的概念有所了解。Boot Loader,也就是引导加载程序,是系统加电后运行的第一段软件代码,它的主要任务是初始化硬件设备、建立内存空间映射,将系统...
本教程将详细介绍如何在Java环境中利用FFmpeg库实现这一功能。 首先,`ffmpeg.jar`是Java版的FFmpeg封装,它提供了与FFmpeg命令行工具类似的接口,方便在Java程序中调用FFmpeg的功能。你需要先将这个JAR文件添加到...
4. **方法实现**: - **`init()`**:初始化方法,主要完成配置加载、登录等前置工作。 - **`action()`**:测试执行方法,控制整个测试流程。 - **`testChain()`**:测试链路方法,循环执行测试场景。 - **`...
此项目展示了Java17里module的使用,最终打包为exe文件,不需要JDK环境 对应文章 https://burn-red.blog.csdn.net/article/details/131443199
Java 类加载器(ClassLoader)是Java虚拟机的重要组成部分,它负责将Java字节码(.class文件)加载到JVM中并转化为`java.lang.Class`的实例,使得我们能够运行Java程序。Java的类加载机制遵循双亲委托模型,这是一种...
### 使用JAVA中的动态代理实现数据库连接池 在Java开发中,数据库连接管理是十分关键的一环,尤其是在高并发场景下,合理的连接管理可以显著提升应用性能。本文将详细介绍如何使用Java中的动态代理技术来实现一个...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...
4. **自定义加载逻辑**:如果需要更复杂的加载逻辑,可以通过实现`Swoole\Loader\LoaderInterface`接口来自定义类库加载器。 5. **性能优化**:Swoole-Loader的性能优化关键在于合理规划类库结构和命名空间,避免...
Java获取接口所有实现类的方式详解 Java 获取接口所有实现类的方式详解是 Java 编程中的一种常见需求。在实际项目中,我们经常需要获取某个接口的所有实现类,以便于实现业务逻辑的需求。对于这个问题,Java 提供...
这些Loader插件将CAD或3DMAX的图形数据转换为Java3D能够理解和渲染的数据结构,从而实现了图形文件的加载和显示。 #### 实现步骤 实现CAD和3DMAX图形文件在Java3D中的加载通常涉及以下步骤: 1. **下载Loader插件...