最近看一些源代码,里面用到了一个类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包有问题,比如多了一层目录?我就出现过这种问题。
分享到:
相关推荐
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` ### 4. 动态加载与懒加载 `ServiceLoader`实现了迭代器模式,可以...
Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示。 介绍 这个演示应用程序包括 6 个小 jar 项目。 云服务 演示伪“云服务”提供者。 为服务提供者定义spidemo.cloud.spi.Cloud接口。 ...
使用java.util.ServiceLoader示例Spring Boot应用程序在类路径上动态加载所有实现。 多项目Gradle构建 1个Spring Boot应用 1个SPI项目 2个SPI实施项目 有关java.util.ServiceLoader用法,请参见app/src/test/java/...
- 服务加载器默认按配置文件中的顺序加载服务提供者,如果需要自定义加载顺序,需要实现`java.util.ServiceLoader.Provider`接口。 - `ServiceLoader`的加载过程只执行一次,如果需要多次加载,需要调用`reload()`...
service-plugin-loader.zip,在java.util.Serviceloader基础上构建的java.util.Serviceloader服务插件加载器的包装。它用于发现和加载作为应用程序扩展/插件的服务。
java.util.ServiceLoader类从 Java 编程语言的第 6 版开始就java.util.ServiceLoader ,它允许您在应用程序中访问和使用不同的服务提供者。 例如,假设服务作者为我们提供了一个名为RandomServiceProvider的接口;...
abstract-service-loader.zip,抽象实现包装java.util.service loader以基于META-INF/services entriesAbstract service loader类包装java.util.serviceloader
Java的`java.util.ServiceLoader`可以帮助我们发现和加载服务,而`java.lang.management.ManagementFactory`可以获取应用的运行时信息,如线程状态、类加载情况等。 为了实现一个全面的服务器监控系统,开发者还...
除了基本的SPI机制,还可以通过自定义`java.util.ServiceLoader.Provider-Implementation`元数据来控制服务加载行为,或者使用第三方库如Apache Commons Lang的`ClassUtils`进行更复杂的类加载操作。 总之,JDK的...
此外,SPI还支持使用自定义加载器,可以通过实现`java.util.ServiceLoader.Provider`接口来自定义加载逻辑。同时,`java.util.ServiceConfigurationError`异常用于处理配置错误,如找不到配置文件或配置文件格式错误...
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 5. **优点** - **可扩展性**:允许第三方开发者扩展应用功能,...
ServiceLoader<Calculator> loader = ServiceLoader.load(Calculator.class); for (Calculator calculator : loader) { System.out.println("Calculator: " + calculator.getClass().getName()); System.out....
WMRouter是一款Android路由框架,基于组件化的...基于SPI (Service Provider Interfaces) 的设计思想,WMRouter提供了ServiceLoader模块,类似Java中的java.util.ServiceLoader,但功能更加完善。通过ServiceLoader可
4. **加载服务**:在主程序中,使用`ServiceLoader.load()`方法加载服务。`ServiceLoader`会自动读取配置文件并实例化所有的服务实现者。 ```java import java.util.ServiceLoader; public class SPIConsumer { ...
7. **网络时区同步**:如果需要确保时区数据是最新的,可以使用`tzdata`更新工具或Java的`java.util.ServiceLoader`机制加载外部的时区数据提供者。 了解和熟练掌握这些知识点,可以帮助开发者更准确地处理Java中的...
还有`java.util.ServiceLoader`,方便加载和使用服务提供者接口。 总的来说,"Java JDK 6.0基础学习笔记"会涵盖这些核心概念,并可能通过实例演示如何使用它们。PPT简体版的学习资料将图文并茂地解释这些知识点,...
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 6. **优势**:SPI使得框架或库可以在不依赖具体实现的情况下...
在`java.util.ServiceLoader`类的帮助下,我们可以方便地加载并使用这些服务提供者。下面我们将详细探讨Java SPI的工作原理、如何创建和使用SPI服务,以及一个具体的`SpiDemo`实例。 1. **SPI工作原理** - **配置...
ServiceLoader<Multiplier> loader = ServiceLoader.load(Multiplier.class); for (Multiplier multiplier : loader) { System.out.println("Multiplication result: " + multiplier.multiply(5, 3)); } } } ``...