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

java.util.ServiceLoader 的使用

阅读更多

      最近看一些源代码,里面用到了一个类ServiceLoad,感觉很有用,就学习了下。

      这个在程序运行时动态选择接口的实现类,功能和Spring很像。

 

      它的主要用法如下

 

ServiceLoader<ITest> testLoads=ServiceLoader.load(ITest.class);
for(ITest t:testLoads){
	System.out.println(t.doJob());
}

  ITtest是一个接口,里面有一个doJob的抽象方法,如下

package cn.test.myInterface;

public interface ITest {

	public String doJob();
}
 

 在这里我们并不知道谁实现了这个接口,这时候灵活性就来了。

 我们写个类实现了这个接口

package cn.test.myImpl;

public class ServerLoadTest implements ITest{
	public String doJob(){
		System.out.println("i can do ----------------------------");
		return "job result";
	}
}

 然后我们将这些程序分别打包,通常定义接口的人不一定是实现接口的人。

比如说我们打包分别为interf.jar , impl.jar

 

那么ServiceLoader是如何将接口是实现联系起来的呢

通过配置文件,这个配置文件在jar包中,从eclipse中导出的jar没法设置,只能通过手动来设置。

我们解压实现的jar包,impl.jar

然后进入META-INF目录下新建services目录,然后在目录中新建文件,文件名为接口的全路径

本文中的全部路径如下

/META-INF/services/cn.test.myInterface.ITest

在文件中输入你实现类的路径

cn.test.MyImpl.ServerLoadTest

 

好了,打包吧,

进入有META-INF文件夹的这个目录,全选打ZIP包,注意后面后缀修改成.jar的形式

(jar 包其实就是一个ZIP包,只是里面有/META-INF的特殊内容而已。)

然后把两个JAR包引入你的项目中吧,

运行下第一段代码试试。

 

很帅吧,如果出现引入错误的情况下,检查下是不是你的JAR包有问题,比如多了一层目录?我就出现过这种问题。

 

 

分享到:
评论
2 楼 tmj_159 2016-06-24  
yuanliangding 写道
最后面是不是少了一块代码。
“运行下第一段代码试试。”
那里没代码。

没有,第一段代码哦,放入main中
1 楼 yuanliangding 2016-05-25  
最后面是不是少了一块代码。
“运行下第一段代码试试。”
那里没代码。

相关推荐

    java.util.ServiceLoader demo

    ServiceLoader&lt;MyService&gt; loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` ### 4. 动态加载与懒加载 `ServiceLoader`实现了迭代器模式,可以...

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

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

    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/...

    ServiceLoader的使用

    - 服务加载器默认按配置文件中的顺序加载服务提供者,如果需要自定义加载顺序,需要实现`java.util.ServiceLoader.Provider`接口。 - `ServiceLoader`的加载过程只执行一次,如果需要多次加载,需要调用`reload()`...

    textrazor-1.0.1.zip

    service-plugin-loader.zip,在java.util.Serviceloader基础上构建的java.util.Serviceloader服务插件加载器的包装。它用于发现和加载作为应用程序扩展/插件的服务。

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

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

    denominator-dynect-4.0.1.zip

    abstract-service-loader.zip,抽象实现包装java.util.service loader以基于META-INF/services entriesAbstract service loader类包装java.util.serviceloader

    Java 服务器信息监控

    Java的`java.util.ServiceLoader`可以帮助我们发现和加载服务,而`java.lang.management.ManagementFactory`可以获取应用的运行时信息,如线程状态、类加载情况等。 为了实现一个全面的服务器监控系统,开发者还...

    jdk spi机制

    除了基本的SPI机制,还可以通过自定义`java.util.ServiceLoader.Provider-Implementation`元数据来控制服务加载行为,或者使用第三方库如Apache Commons Lang的`ClassUtils`进行更复杂的类加载操作。 总之,JDK的...

    通过SPI实现动态加载外部jar的实现类

    此外,SPI还支持使用自定义加载器,可以通过实现`java.util.ServiceLoader.Provider`接口来自定义加载逻辑。同时,`java.util.ServiceConfigurationError`异常用于处理配置错误,如找不到配置文件或配置文件格式错误...

    java spi实现工程

    ServiceLoader&lt;MyService&gt; loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 5. **优点** - **可扩展性**:允许第三方开发者扩展应用功能,...

    SPI示例代码及实现方式

    ServiceLoader&lt;Calculator&gt; loader = ServiceLoader.load(Calculator.class); for (Calculator calculator : loader) { System.out.println("Calculator: " + calculator.getClass().getName()); System.out....

    Android代码-WMRouter

    WMRouter是一款Android路由框架,基于组件化的...基于SPI (Service Provider Interfaces) 的设计思想,WMRouter提供了ServiceLoader模块,类似Java中的java.util.ServiceLoader,但功能更加完善。通过ServiceLoader可

    SPI入门级Demo(三:服务实现者-加法服务)

    4. **加载服务**:在主程序中,使用`ServiceLoader.load()`方法加载服务。`ServiceLoader`会自动读取配置文件并实例化所有的服务实现者。 ```java import java.util.ServiceLoader; public class SPIConsumer { ...

    java时区问题

    7. **网络时区同步**:如果需要确保时区数据是最新的,可以使用`tzdata`更新工具或Java的`java.util.ServiceLoader`机制加载外部的时区数据提供者。 了解和熟练掌握这些知识点,可以帮助开发者更准确地处理Java中的...

    Java JDK 6.0基础学习笔记.rar

    还有`java.util.ServiceLoader`,方便加载和使用服务提供者接口。 总的来说,"Java JDK 6.0基础学习笔记"会涵盖这些核心概念,并可能通过实例演示如何使用它们。PPT简体版的学习资料将图文并茂地解释这些知识点,...

    spi-Demo.rar

    ServiceLoader&lt;MyService&gt; loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 6. **优势**:SPI使得框架或库可以在不依赖具体实现的情况下...

    Java的Spi使用实例

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

    SPI入门级Demo(四:服务实现者-乘法服务)

    ServiceLoader&lt;Multiplier&gt; loader = ServiceLoader.load(Multiplier.class); for (Multiplier multiplier : loader) { System.out.println("Multiplication result: " + multiplier.multiply(5, 3)); } } } ``...

Global site tag (gtag.js) - Google Analytics