先从业务场景分析,要完成数据的分析处理功能。根据数据的不同种类,先调用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. SenjuFamily项目总结 之 Activiti 学习总结(一)

    项目干了一年了,最近开始整理一下项目中用到的知识,算是年末总结了. 大概有如下几个点: 1.Actitivi 2.JPA 3.WebService 4.JVM使用以及代码优化(这个地方,主要参考周志明 ...

  2. python中的print函数

    python3.x中将print由一个声明转变成了一个函数. 官方说法: Converts the print statement to the print() function. print(*ob ...

  3. Unity 官方文档学习

    Manual Texture Components:https://docs.unity3d.com/Manual/comp-Textures.html Profiler:https://docs.u ...

  4. Winform里面的缓存,MemoryCache使用

    缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.本文主要针对自己在Winform方面的缓存使用做一个引导性的介绍,希望大家能够从中了解一些缓存 ...

  5. linux之 awk

    简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进 ...

  6. oracle之 如何 dump logfile

    这篇文章解释了如何在联机或归档重做日志文件中获取转储. 约束和限制:1.数据库必须安装(或打开).更改系统转储日志文件与任何实例无关,因此不需要为其操作安装数据库.但是,在ALTER SYSTEM D ...

  7. python的requests快速上手、高级用法和身份认证

    https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...

  8. .NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对 ...

  9. 计算MySQL的内存峰值公式 (转)

    -- 计算MySQL的内存峰值公式,计算所有的连接满了的情况下: select (@@key_buffer_size + @@query_cache_size + @@tmp_table_size   ...

  10. http修改443端口,http 强制跳转https

    修改apache http/https 端口号 1.修改http的端口 打开$HTTPD_HOME/conf/httpd.conf文件,找到Listen,后面紧跟的是端口号,默认是80,把它修改为你想 ...