最近看一些源代码,里面用到了一个类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包有问题,比如多了一层目录?我就出现过这种问题。
分享到:
相关推荐
本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java.util.zip包现数据压缩与解压
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
java.util.ConcurrentModificationException 异常问题详解1
详细介绍了java.util.logging.Logger的用法和结构,对如果扩展Logger起到抛砖引玉的作用!尊重劳动成果,亲下载了要给个评价!
Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示。 介绍 这个演示应用程序包括 6 个小 jar 项目。 云服务 演示伪“云服务”提供者。 为服务提供者定义spidemo.cloud.spi.Cloud接口。 ...
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
Exception in thread “main“ java.util.InputMismatchException
java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx
java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1)
使用java.util.ServiceLoader示例Spring Boot应用程序在类路径上动态加载所有实现。 多项目Gradle构建 1个Spring Boot应用 1个SPI项目 2个SPI实施项目 有关java.util.ServiceLoader用法,请参见app/src/test/java/...
java并发工具包 java.util.concurrent中文版-带书签版
详细介绍java.util.Date和java.sql.Date相互转换的多种方法总结,希望对大家有帮助
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家
java.util包
使用java.util.timer实现的简单定时任务,在实现简单一次性定时任务时,使用java.util.timer非常的简单易用,适合没有接触过quartz的新手急用。
NULL 博文链接:https://wen866595.iteye.com/blog/1541386
世界范围内的时区列表。由 java.util.TimeZone 类导出
java.util包源码,pdf版,方便打印
java.util.pdf
java.util包总结,方便大家学习。请多指教。