近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到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. [HEOI2014]大工程

    题目描述 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 ...

  2. TopCoder SRM 561 Div 1 - Problem 1000 Orienteering

    传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一 ...

  3. 【AHOI2005】病毒检测

    题目描述 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地. 科学家们经过几 ...

  4. CentOS7.4 源码安装MySQL8.0

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以下为本人2018.4.23日安装过程的记录.整个过程大 ...

  5. vim配置文件和插件管理

    本文通过总结零碎的资料总结而成,更多是去引导学习vim配置文件及插件使用. .vimrc配置文件,内容如下(备注清晰) "引入插件pathogen使用 execute pathogen#in ...

  6. SQL Server 2008 维护计划实现数据库备份(最佳实践)

    一.背景 之前写过一篇关于备份的文章:SQL Server 维护计划实现数据库备份,上面文章使用完整备份和差异备份基本上能解决数据库备份的问题,但是为了保障数据更加安全,我们需要再次完善我们的备份计划 ...

  7. Mysql优化--慢查询日志

    Mysql 系列文章主页 =============== 默认没有开启慢查询日志功能.如果不是调优需要的话,一般不建议开启. 查看是否开启慢查询日志: SHOW VARIABLES LIKE '%sl ...

  8. 在Spring Boot中使用Spring Security实现权限控制

    丢代码地址 https://gitee.com/a247292980/spring-security 再丢pom.xml <properties> <project.build.so ...

  9. vue中的eventBus

    在vue2中,父子组件传递数据,父组件可以直接传递数据进子组件,而子组件通过调用父组件传递进来的方法,将自己的数据传递回去. 那兄弟组件之间,或者是兄弟组件的子组件之间如何传递呢? 当然vuex是一种 ...

  10. Ubuntu 14.04 16.04 17.10 + Win10 双系统安装记录 + 分区大小选择办法

    安装了N遍,重要的东西在此记录. 参考了 http://www.libinx.com/2017/five-steps-win10-ubuntu-dual-boot/ 忠告:为了让日后喘气能匀呼些,要选 ...