ServiceLoader是用来分动态的获取接口实现的较原始的方式。首先如果想使用它的特性的话,先要理解java的编译和jar包是分开的这个概念。很多时候我们依赖IDE去完成所有的工作,所以会将打包也做作开发的一部分,觉得改jar包里面的东西都算是重新编译。这样的话就会觉得这个工具没有什么用。但是如果分离开的话。这个工具就变得很简单好使。想比spring的ioc要轻量很多。具体怎么用我就不说了网上一找一大堆。我只总结一下最主要的几点就行了。要想使用这个工具重点是三点。路径、文件、内容。
路径是死的记住就行了。实在记不住翻源码吧。第一行就是:
private static final String PREFIX ="META-INF/services/";
文件这个是要跟接口的全路径名完全一致的。这是为什么呢?起这么古怪的名子真的好吗?看看代码吧。他是用下面这种方式取的配置文件名。所以没办法。只能这么玩了。
String fullName = PREFIX +service.getName();
内容这个很简单就是实现类的全路径名。不过有一点要注意。一个实现类写一行就行了。因为你写一百行也是一样的。只会实例化一次。代码是这样写的。
if (!providers.containsKey(ln) &&!names.contains(ln))
names.add(ln);
下面来个例子吧,请参考:
路径:
META-INF\services
文件:
com.test.ServiceLoader.ServiceI
内容:
com.test.ServiceLoader.ServiceImp
com.test.ServiceLoader.Service2Imp