`

ServiceLoader的使用

阅读更多
    发现ServiceLoader是个类似spring的东西,可以指定接口和实现,通过ServiceLoader去载入。
下面是我的一个例子:

package com.test2;

import java.util.ServiceLoader;
import com.test.IHello;

public class Main {
	public static void main(String[] args) {
		ServiceLoader<IHello> loder=ServiceLoader.load(IHello.class);
		for (IHello hello : loder) {
			System.out.println(hello.getClass());
			hello.sayHello();
		}
	}

}


依赖的IHello是在另外一个jar包:test.jar.在test.jar里有一个接口,两个实现,Hello1和Hello2. 通过在的META-INF下的services文件夹的com.test.IHello文件来指定实现,多个实现的时候使用换行。
如我的项目中就是

com.test.Hello1
com.test.Hello2


注意,这个只能是打成jar之后给其他项目用,自己是不可以用自己的。



附件有我的源码
  • 大小: 83.9 KB
0
2
分享到:
评论
6 楼 湘雨轩 2016-08-19  
不是一定要打成jar包供其它项目用,是因为你在运行测试类的时候,你的META-INF/services/com.test.IHello根本没在classpath目录下。请看ServiceLoader.class里面的部份源代码:
private static final String PREFIX = "META-INF/services/";
.......
.......
.......
if (configs == null) {
    try {
        String fullName = PREFIX + service.getName();
        if (loader == null)
            configs = ClassLoader.getSystemResources(fullName);
        else
            configs = loader.getResources(fullName);
    } catch (IOException x) {
        fail(service, "Error locating configuration files", x);
    }
}



所以你只需要将META-INF文件夹拷贝到test/bin目录下,跟编译的.class文件放在同一个文件夹bin里,这样才能确保ClassLoader.getSystemResources(fullName)可以加载到这个资源文件。当然你打成一个jar包,就是因为你的这个jar包括了这个资源文件,并且在classpath里面,所以ClassLoader可以找得到它。
5 楼 yuanliangding 2016-05-25  
有了ServiceLoader,
接口和实现分离才是更有生命意义呀。

~_^
4 楼 huangyunbin 2013-06-07  
54wangyong 写道
看来楼主没有讲清楚啊,其实这个就是java 的SPI机制,具体的这个机制是什么,大家可以上网查查,然后就知道这个原理了。这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准。像一些jdbc驱动的的实现就是用这个机制的。mysql提供自己的驱动实现,oracle厂商提供自己的jdbc驱动实现


其实我对java的这个spi的实现很是不解,为什么要在jar包的META-INF去做这个事情呢。这样就只能在jar包的形式了。如果用classpath的形式应该会更好吧。
3 楼 54wangyong 2013-06-07  
看来楼主没有讲清楚啊,其实这个就是java 的SPI机制,具体的这个机制是什么,大家可以上网查查,然后就知道这个原理了。这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准。像一些jdbc驱动的的实现就是用这个机制的。mysql提供自己的驱动实现,oracle厂商提供自己的jdbc驱动实现
2 楼 huangyunbin 2013-06-07  
求求你帮帮我 写道
没看懂啊,大婶。


就是当用一个jar包里的接口的时候,这个jar包的接口可以在配置文件写好这个接口的实现类似哪个。
1 楼 求求你帮帮我 2013-06-07  
没看懂啊,大婶。

相关推荐

    JavaServiceProviderInterfaceDemo:Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示

    Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示。 介绍 这个演示应用程序包括 6 个小 jar 项目。 云服务 演示伪“云服务”提供者。 为服务提供者定义spidemo.cloud.spi.Cloud接口。 ...

    java.util.ServiceLoader demo

    下面将详细探讨`ServiceLoader`的工作原理、使用方法以及它在实际开发中的应用场景。 ### 1. `ServiceLoader`概述 `ServiceLoader` 是一种基于Java的SPI(Service Provider Interface)机制,允许第三方开发者为已...

    spring-boot-java-util-service-loader:使用java.util.ServiceLoader的示例Spring Boot应用程序在类路径上动态加载所有SPI实现

    使用java.util.ServiceLoader示例Spring Boot应用程序在类路径上动态加载所有实现。 多项目Gradle构建 1个Spring Boot应用 1个SPI项目 2个SPI实施项目 有关java.util.ServiceLoader用法,请参见app/src/test/java/...

    服务治理中间件dubbo原理解析

    Dubbo中的ServiceLoader使用了一个SPI接口定义,并通过一个工厂类(如SpiFactory)来管理所有的实现类。工厂类提供了根据名称获取具体实现的方法,这样的设计方式使得Dubbo内部的模块可以方便地通过SPI接口获取到...

    详谈ServiceLoader实现原理

    1. **ServiceLoader的使用步骤**: - 首先,定义一个接口,例如这里的`Animal`接口,其中包含需要实现的方法。 - 接着,创建该接口的实现类,如`Pig`和`Dog`,确保它们具有公共无参构造器,因为ServiceLoader会...

    Inversion:轻松检索接口的所有实现

    反转简化了ServiceLoader使用,以检索特定接口的所有实现。 使用Inversion可以很容易地在多模块项目中使用依赖项反转。 基本例子 第一个模块定义一个接口和一个create字段(用InversionDef注释)来创建该接口的实际...

    Java SPI 机制(SPI实战+ServiceLoader源码分析+SPI 应用场景+破坏双亲委派)

    4. 使用 ServiceLoader:使用 ServiceLoader 加载和实例化提供者的实现类。 SPI 机制的破坏双亲委派: 1. SPI 机制可以破坏双亲委派,因为 ServiceLoader 可以加载第三方提供者的实现类。 2. 例如,在 JDBC 连接池...

    System源码java-serviceloader-migration:将ServiceLoader迁移到Java9模块系统的源代码

    在Java编程语言中,`ServiceLoader`是一个非常重要的组件,它允许我们按照Java的SPI(Service Provider Interface)机制来加载和使用服务提供商。这个标题提到的"System源码java-serviceloader-migration"是一个项目...

    manga-aggregator:Java ServiceLoader示例

    在实际开发中,合理利用ServiceLoader可以提高代码的可维护性和可扩展性,但同时也需要注意其使用过程中的限制和潜在问题。在项目中运用ServiceLoader,可以提升软件的灵活性和模块化程度,更好地适应不断变化的需求...

    Flex与后台交互的方法_HTTPService_WebService_URLLoader

    使用HTTPService,开发者可以轻松地向后端发送XML、JSON或其他格式的数据,并接收响应。配置HTTPService时,我们需要指定URL、请求方法和要传递的数据格式。 二、WebService WebService是一种基于SOAP(Simple ...

    native-image-service-loader-demo:一个简单的演示项目,用于将ServiceLoader与GraalVM本机图像一起使用

    一个简单的演示项目,用于将ServiceLoader与本机图像一起使用。 用以下方法构建罐子: $ mvn package 使用以下命令在JVM上运行: $ java -jar target/ServiceLoaderTest-1.0-SNAPSHOT.jar 输出应为: services....

    数据库jdbc驱动加载过程

    JDBC 4.0 版本引入了 Java SPI 机制来加载驱动程序,使用 ServiceLoader 机制来加载驱动程序,并将其注册到 DriverManager 中。这样,应用程序就可以使用 JDBC 驱动程序来连接到数据库并进行数据交互。

    Java的Spi使用实例

    在`java.util.ServiceLoader`类的帮助下,我们可以方便地加载并使用这些服务提供者。下面我们将详细探讨Java SPI的工作原理、如何创建和使用SPI服务,以及一个具体的`SpiDemo`实例。 1. **SPI工作原理** - **配置...

    serviceloader:这是一个让你理解java服务加载器机制的例子

    Java服务加载器(ServiceLoader)是Java平台标准版(Java SE)中的一种设计模式,它允许应用程序使用服务提供者接口(SPI,Service Provider Interface)来动态发现和加载服务实现。这个机制使得软件组件之间可以...

    SPI设计思想.zip

    - **服务使用**:应用程序可以通过迭代`ServiceLoader`加载的服务提供者列表,选择合适的实现进行使用。 2. SPI工作流程: - (1) 创建`ServiceLoader`对象,传入需要加载的服务接口类型。 - (2) 使用`...

    osgi-resource-locator-1.0.1-API文档-中文版.zip

    赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    java-service-spi-example:Java SPI(服务提供者示例)

    java.util.ServiceLoader类从 Java 编程语言的第 6 版开始就java.util.ServiceLoader ,它允许您在应用程序中访问和使用不同的服务提供者。 例如,假设服务作者为我们提供了一个名为RandomServiceProvider的接口;...

    SPI入门级Demo(五:服务消费者)

    5. **服务消费者**(Service Consumer):应用中的代码,使用`ServiceLoader`加载服务并调用其方法。 工作流程大致如下: 1. 应用启动时,`ServiceLoader`会读取`META-INF/services/`目录下对应接口的配置文件。 2....

Global site tag (gtag.js) - Google Analytics