近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到properties中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究java中有没有这种支持,最终确认ServiceLoader可以实现这种功能,下面讲解如何使用ServiceLoader类。

首先定义一个接口程序的定义如下:

public interface IShareniuService {
public String sayHello();

public String getScheme();
}
public class ShareniuserverImp1 implements IShareniuService {

public String sayHello() {
return "shareniu1sayHello";
}

public String getScheme() {
return "shareniu1getScheme";
}

}
public String sayHello() {
return "shareniu2sayHello";
}

public String getScheme() {
return "shareniu2getScheme";
}

需要在META-INF/services下以IShareniuService这个类的全名来新建立一个文件,文件中的内容为两个实现类的全名,如下:

所有的实现和配置都已经完成,下面写一个测试类来看一下结果:

   ServiceLoader<IShareniuService> serviceLoader = ServiceLoader
                .load(IShareniuService.class);
        for (IShareniuService service : serviceLoader) {
            System.out.println(service.getScheme()+"="+service.sayHello());
        }  

具体的输出来如下:

shareniu2getScheme=shareniu2sayHello

shareniu1getScheme=shareniu1sayHello

可以看到ServiceLoader可以根据IShareniuService把定义的两个实现类找出来,返回一个ServiceLoader的实现,而ServiceLoader实现了Iterable接口,所以可以通过ServiceLoader来遍历所有在配置文件中定义的类的实例

hadoop中 FileSystem就是通过这个机制来根据不同文件的scheme来返回不同的FileSystem。

FileSystem中的相关实例如下:

private static void loadFileSystems() {  

  synchronized (FileSystem.class) {  

    if (!FILE_SYSTEMS_LOADED) {  

      ServiceLoader<FileSystem> serviceLoader = ServiceLoader.load(FileSystem.class);  

      for (FileSystem fs : serviceLoader) {  

        SERVICE_FILE_SYSTEMS.put(fs.getScheme(), fs.getClass());  

      }  

      FILE_SYSTEMS_LOADED = true;  

    }  

  }  

}

FileSystem对应的配置如下:

org.apache.hadoop.fs.LocalFileSystem  

org.apache.hadoop.fs.viewfs.ViewFileSystem  

org.apache.hadoop.fs.s3.S3FileSystem  

org.apache.hadoop.fs.s3native.NativeS3FileSystem  

org.apache.hadoop.fs.kfs.KosmosFileSystem  

org.apache.hadoop.fs.ftp.FTPFileSystem  

org.apache.hadoop.fs.HarFileSystem

通过之前的测试类输出对应的scheme和class如下:

file=class org.apache.hadoop.fs.LocalFileSystem  

viewfs=class org.apache.hadoop.fs.viewfs.ViewFileSystem  

s3=class org.apache.hadoop.fs.s3.S3FileSystem  

s3n=class org.apache.hadoop.fs.s3native.NativeS3FileSystem  

kfs=class org.apache.hadoop.fs.kfs.KosmosFileSystem  

ftp=class org.apache.hadoop.fs.ftp.FTPFileSystem  

har=class org.apache.hadoop.fs.HarFileSystem  

hdfs=class org.apache.hadoop.hdfs.DistributedFileSystem  

hftp=class org.apache.hadoop.hdfs.HftpFileSystem  

hsftp=class org.apache.hadoop.hdfs.HsftpFileSystem  

webhdfs=class org.apache.hadoop.hdfs.web.WebHdfsFileSystem

可以看到FileSystem会把所有的FileSystem的实现都以scheme和class来cache,之后就从这个cache中取相应的值。

因此,以后可以通过ServiceLoader来实现一些类似的功能。而不用依赖像Spring这样的第三方框架。

java.util.ServiceLoader使用的更多相关文章

  1. java.util.ServiceLoader的用法

    在很多开源组件里经常会看到java.util.ServiceLoader的使用,这里给大家介绍下怎么通过ServiceLoader找到一个接口的所有实现类. 我们新建一个接口Hello public ...

  2. 软件包 java.util 的分层结构

    概述  软件包  类  使用   树  已过时  索引  帮助  JavaTM Platform Standard Ed. 6  上一个   下一个 框架    无框架    所有类         ...

  3. Java集合类 java.util包

    概述   软件包  类  使用  树  已过时  索引  帮助  JavaTM Platform Standard Ed. 6  上一个软件包   下一个软件包 框架    无框架           ...

  4. Java之ServiceLoader

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6946683.html 1.简介 JDK1.6之后,java.util包下多了一个类ServiceLoader,其 ...

  5. Java-API-Package:java.util

    ylbtech-Java-API-Package:java.util 1.返回顶部 1. java.util Interfaces Collection Comparator Deque Enumer ...

  6. 【转】java.util.Arrays.asList 的用法

    DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...

  7. Java程序日志:java.util.logging.Logger类

    一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...

  8. Android中使用java.util.Properties犯的错

    今天尝试使用java.util.Properties来保存应用配置,然而遇到了好几个问题,对于熟悉此内容的来说可能都是猪一样的错误,但难免有像我一样的新手再次遇到,希望此文能有所帮助. 错误1 jav ...

  9. java.util.ConcurrentModificationException 解决办法(转载)

    今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码:   public cla ...

随机推荐

  1. [USACO 09FEB]Fair Shuttle

    Description 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让 奶牛们也能愉快地逛集市,约翰准备让奶 ...

  2. SPOJ Coconuts 最大流 最小割

    A group of n castle guards are voting to determine whether African swallows can carry coconuts. Whil ...

  3. hdu 5533(几何水)

    Input The first line contains a integer T indicating the total number of test cases. Each test case ...

  4. 基于Android的高校饮水宝app

     这是一个高校饮用水配送项目,是一个毕业设计,去年的,包括了服务端和客户端,是一个不错的项目,分享一下: 随着通讯行业的迅猛发展,我国的手机用户也在不断的增加.据信息部的统计数据显示,我国已有接近7. ...

  5. box-sizing position

    box-sizing 属性 用于更改用于计算元素宽度和高度的默认的 CSS 盒子模型.可以使用此属性来模拟不正确支持CSS盒子模型规范的浏览器的行为. /* 关键字 值 */ box-sizing: ...

  6. 如何成为快手尬舞王?HUAWEI HiAI了解一下!

    左手!右手!抱一抱!扭一扭! 快手短视频,红遍东西南北中, 给大家的生活增添了不少乐趣. 有了人体姿态识别的魔法表情, 不会跳舞的也都可以跟着跳一跳. 从村口朴实的阿姨,到写字楼里端庄的白领, 在人体 ...

  7. lgp20151222 java中如何将Object类型转换为int类型

    if (object instanceof Integer) {    Integer.parseInt(object.toString()); } 很简单是不是?我就想提醒下自己,java有个特殊词 ...

  8. 京东消息中间件JMQ

    http://blog.csdn.net/javahongxi/article/details/54411464 [京东技术]京东的MQ经历了JQ->AMQ->JMQ的发展,其中JQ的基于 ...

  9. hive 存储,解析,处理json数据

    hive 处理json数据总体来说有两个方向的路走 1.将json以字符串的方式整个入Hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如使用LATERAL VIEW json_tu ...

  10. LintCode题解之最长单词

    这些一次遍历搞定的,套路无非都是在遍历的时候就记录数据的状态,然后根据遍历到的当前的数据的状态来修改最终结果,当遍历完了的时候结果也就确定了. public class Solution { /* * ...