`

ServiceLoader的使用

阅读更多
    发现ServiceLoader是个类似spring的东西,可以指定接口和实现,通过ServiceLoader去载入。
下面是我的一个例子:

package com.test2;

import java.util.ServiceLoader;
import com.test.IHello;

public class Main {
	public static void main(String[] args) {
		ServiceLoader<IHello> loder=ServiceLoader.load(IHello.class);
		for (IHello hello : loder) {
			System.out.println(hello.getClass());
			hello.sayHello();
		}
	}

}


依赖的IHello是在另外一个jar包:test.jar.在test.jar里有一个接口,两个实现,Hello1和Hello2. 通过在的META-INF下的services文件夹的com.test.IHello文件来指定实现,多个实现的时候使用换行。
如我的项目中就是

com.test.Hello1
com.test.Hello2


注意,这个只能是打成jar之后给其他项目用,自己是不可以用自己的。



附件有我的源码
  • 大小: 83.9 KB
0
2
分享到:
评论
6 楼 湘雨轩 2016-08-19  
不是一定要打成jar包供其它项目用,是因为你在运行测试类的时候,你的META-INF/services/com.test.IHello根本没在classpath目录下。请看ServiceLoader.class里面的部份源代码:
private static final String PREFIX = "META-INF/services/";
.......
.......
.......
if (configs == null) {
    try {
        String fullName = PREFIX + service.getName();
        if (loader == null)
            configs = ClassLoader.getSystemResources(fullName);
        else
            configs = loader.getResources(fullName);
    } catch (IOException x) {
        fail(service, "Error locating configuration files", x);
    }
}



所以你只需要将META-INF文件夹拷贝到test/bin目录下,跟编译的.class文件放在同一个文件夹bin里,这样才能确保ClassLoader.getSystemResources(fullName)可以加载到这个资源文件。当然你打成一个jar包,就是因为你的这个jar包括了这个资源文件,并且在classpath里面,所以ClassLoader可以找得到它。
5 楼 yuanliangding 2016-05-25  
有了ServiceLoader,
接口和实现分离才是更有生命意义呀。

~_^
4 楼 huangyunbin 2013-06-07  
54wangyong 写道
看来楼主没有讲清楚啊,其实这个就是java 的SPI机制,具体的这个机制是什么,大家可以上网查查,然后就知道这个原理了。这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准。像一些jdbc驱动的的实现就是用这个机制的。mysql提供自己的驱动实现,oracle厂商提供自己的jdbc驱动实现


其实我对java的这个spi的实现很是不解,为什么要在jar包的META-INF去做这个事情呢。这样就只能在jar包的形式了。如果用classpath的形式应该会更好吧。
3 楼 54wangyong 2013-06-07  
看来楼主没有讲清楚啊,其实这个就是java 的SPI机制,具体的这个机制是什么,大家可以上网查查,然后就知道这个原理了。这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准。像一些jdbc驱动的的实现就是用这个机制的。mysql提供自己的驱动实现,oracle厂商提供自己的jdbc驱动实现
2 楼 huangyunbin 2013-06-07  
求求你帮帮我 写道
没看懂啊,大婶。


就是当用一个jar包里的接口的时候,这个jar包的接口可以在配置文件写好这个接口的实现类似哪个。
1 楼 求求你帮帮我 2013-06-07  
没看懂啊,大婶。

相关推荐

Global site tag (gtag.js) - Google Analytics