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

    Description 一个n*n(n>=2)棋盘上有黑白棋子各一枚.游戏者A和B轮流移动棋子,A先走. A的移动规则:只能移动白棋子.可以往上下左右四个方向之一移动一格. B的移动规则:只能移 ...

  2. python正则表达式与Re库

    正则表达式是用来简洁表达一组字符串的表达式,一行胜千言,有点类似于数列的通项公式. 在python中提供了re库(regular expression)即正则表达式库,内置于python的标准库中,导 ...

  3. 如何理解Spring IOC

    Spring IOC 思维导图 要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Pr ...

  4. application-config.xml和mvc-config.xml的区别

    头一个放bean之类的东西 后一个放controllers, view resolvers之类的东西

  5. tomcat7+jdk的keytool生成证书 配置https

    目前只会使用jdk的keytool来生成证书.本文仅介绍这种方法. 1Windows下: 1.1 生成keystore文件及导出证书 打开控制台: 运行: %JAVA_HOME%\bin\keytoo ...

  6. SQL注入原理及绕过安全狗

    1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...

  7. sql 复习练习

          一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- ...

  8. C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节

    C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立艺术级图形界面 ...

  9. 如何在joomla上展示word,pdf,xlsx,ppt

    去年用slideshare,非常好用,只要在joomla上装上插件,就能直接把slideshare上的文件弄到网站上了,但是前几天突然发现slideshare登不进去了,而<embed>下 ...

  10. Django 跨域请求处理

    参考https://blog.csdn.net/qq_27068845/article/details/73007155 http://blog.51cto.com/aaronsa/2071108 d ...