`
tmj_159
  • 浏览: 700274 次
  • 性别: 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  
最后面是不是少了一块代码。
“运行下第一段代码试试。”
那里没代码。

相关推荐

Global site tag (gtag.js) - Google Analytics