先从业务场景分析,要完成数据的分析处理功能。根据数据的不同种类,先调用groovy或者python脚本等中的一种处理数据,处理完数据的后需要流程相同。

  要支持处理能力的动态扩展,也就是框架完成后,可以再增加新的处理能力,而不改变原有的代码。如要增加el处理数据的能力。

  这时ServiceLoader可以方便的完成需求。

  先看所需的模块。groovy,python模块是具体的处理模块。plat模块使用ServiceLoader调用groovy或者python模块,再完成后续处理。pon模块是一个业务测试模块

  

  先看plat模块中的接口类IService:

package com.service;

public interface IService {
String getService(); String handle();
}

  DataProcess类,ServiceLoader调用groovy或者python模块:

package com;

import com.service.IService;
import java.util.ServiceLoader; public class DataProcess {public IService getService(String name) {
IService properService = null;
ServiceLoader<IService> serviceLoader = ServiceLoader.load(IService.class);
for (IService service : serviceLoader) {
if (service.getService().equalsIgnoreCase(name)) {
properService= service;
}
}
return properService;
} }

  GroovyService,使用groovy处理数据的示例代码:

package com;

import com.service.IService;

public class GroovyService implements IService {

    public String getService() {
return "groovy";
} public String handle() {
return "groovy handle data";
} }

  groovy模块下的resources下,要有META-INF\services\com.service.IService文件,内容如下:

com.GroovyService

  

  再看业务测试模块pon下的测试类:

package com.pon;

import com.GroovyService;
import com.PythonService;
import com.DataProcess; public class TestProcess {
public static void main(String[] args) {
DataProcess process = new DataProcess();
GroovyService groovyService = (GroovyService) process.getService("groovy");
PythonService pythonservice = (PythonService) process.getService("python");
System.out.println(groovyService.handle());
System.out.println(pythonservice.handle());
}
}

  测试的结果为:

  需要增加el处理能力时,新增el模块,plat模块的处理不需要改变。

  ServiceLoader会classpath下的jar包,分析META-INF/services中放置提供者配置文件来标识服务提供者。看看pon模块的依赖。

 

  

  Hadoop FileSystem就是通过这个机制来根据不同文件的scheme来返回不同的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; 

    } 

  } 

}

  对应的配置文件:

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

  可以看到FileSystem会把所有的FileSystem的实现都以scheme和class来cache,之后就从这个cache中取相应的值。因此,以后可以通过ServiceLoader来实现一些类似的功能,而不用依赖像Spring这样的第三方框架。

  

   

ServiceLoader的更多相关文章

  1. ServiceLoader的使用

    ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一个类声明周期的第一步(一个java类的完整的生命周期 ...

  2. Dubbo源码学习--环境搭建及基础准备(ServiceLoader、ExtensionLoader)

    环境搭建 Github上下载Dubbo最新发布版本,楼主下载版本为2.5.7. cd到源码解压目录,maven编译,命令为: mvn clean install -Dmaven.test.skip 生 ...

  3. java.util.ServiceLoader使用

    近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到properties中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究java中有没有 ...

  4. ServiceLoader详解

    系统中用到了ServiceLoader,查了一下: ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一 ...

  5. Java ServiceLoader(SPI)学习

    1. 几个不错的关于ServiceLoader的文章,大家可以先参考一下 1) http://www.myexception.cn/program/1355384.html 这篇的后面的问题分析不错 ...

  6. 【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  7. Java之ServiceLoader

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

  8. java.util.ServiceLoader的用法

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

  9. 认识serviceLoader

    最近在研究系统设计方面的东西,发现有很多通用的解决方案,包括spring配置扩展以及serviceLoader的应用,这里简单记录下serviceLoader的简单应用,网上例子很多,大同小异,本人觉 ...

随机推荐

  1. ACM-ICPC 2018 徐州赛区网络预赛(9.9)

    #include<bits/stdc++.h> #define int long long using namespace std; ; ; ]; int quick(int a,int ...

  2. 《DSP using MATLAB》Problem 6.18

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  3. hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...

  4. window.location.herf=url参数有中文,到后台乱码问题解决

    js中的代码: /*将中文的参数进行两次编码 */ function queryByName(){                    //获取查询条件的用户名                   ...

  5. CSVN备份初体验

    备份方法挺多的,目前我知道有四种 其一: 首先复制旧csvn服务器上repositories下的版本库文件夹到新csvn服务器repositories文件夹下面(做以下修改时最好把csvn服务停掉) ...

  6. Android中控制Dialog呈现的时间

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zinss26914/article/details/36900157 用线程控制dialog的呈现时 ...

  7. 深入详解美团点评CAT跨语言服务监控(二) CAT服务端初始化

    Cat模块 Cat-client : cat客户端,编译后生成 cat-client-2.0.0.jar ,用户可以通过它来向cat-home上报统一格式的日志信息,可以集成到 mybatis.spr ...

  8. java 中 heap(堆)和stack(栈)的区别

    总结在Java里面Heap和Stack分别存储数据的不同. 区别项 Heap(堆) Stack(栈) JVM中的功能 内存数据区 内存指令区 存储数据 对象实例(注1) 基本数据类型, 指令代码,常量 ...

  9. idea的svn安装

    https://blog.csdn.net/qq_27093465/article/details/74898489

  10. secureCRT 设置证书免密登陆

    1 第一步 2 第二步 3 第三步 4 第4 步 ,然后选择你的 私钥文件