最近看一些源代码,里面用到了一个类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包有问题,比如多了一层目录?我就出现过这种问题。