ServiceLoader
先从业务场景分析,要完成数据的分析处理功能。根据数据的不同种类,先调用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的更多相关文章
- ServiceLoader的使用
ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一个类声明周期的第一步(一个java类的完整的生命周期 ...
- Dubbo源码学习--环境搭建及基础准备(ServiceLoader、ExtensionLoader)
环境搭建 Github上下载Dubbo最新发布版本,楼主下载版本为2.5.7. cd到源码解压目录,maven编译,命令为: mvn clean install -Dmaven.test.skip 生 ...
- java.util.ServiceLoader使用
近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到properties中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究java中有没有 ...
- ServiceLoader详解
系统中用到了ServiceLoader,查了一下: ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一 ...
- Java ServiceLoader(SPI)学习
1. 几个不错的关于ServiceLoader的文章,大家可以先参考一下 1) http://www.myexception.cn/program/1355384.html 这篇的后面的问题分析不错 ...
- 【java编程】ServiceLoader使用看这一篇就够了
转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...
- Java之ServiceLoader
转载请注明源出处:http://www.cnblogs.com/lighten/p/6946683.html 1.简介 JDK1.6之后,java.util包下多了一个类ServiceLoader,其 ...
- java.util.ServiceLoader的用法
在很多开源组件里经常会看到java.util.ServiceLoader的使用,这里给大家介绍下怎么通过ServiceLoader找到一个接口的所有实现类. 我们新建一个接口Hello public ...
- 认识serviceLoader
最近在研究系统设计方面的东西,发现有很多通用的解决方案,包括spring配置扩展以及serviceLoader的应用,这里简单记录下serviceLoader的简单应用,网上例子很多,大同小异,本人觉 ...
随机推荐
- 《DSP using MATLAB》Problem 5.30
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 刚开始学java和刚去工作的时候,1.path路径 2.classpath路径 还有JAVA_HOME相当于/dgs这个路径
把里面bin文件夹下面的可执行文件都配置到path路径下了,以后只要在Dos窗口输入命令就可以运行 无论是在dos窗口下还是在eclispe中只需要配置这个path变量,不需要配置classpath ...
- linux 控制结构
一.if 注: 格式1.格式2:一个条件一个命令: 格式3:一个条件两个命令: 格式4:两个条件三个命令,注意条件的写法. 例1: #!/bin/sh#ifTest#to show the metho ...
- Django中需要注意的点
需要注意的点 请求相关 注销的 用法 def logout(request): request.session.flush()#输入此内容可以注销用户登录信息 # 即将session信息清除掉 ret ...
- 记录:.user.ini 使用
记录:.user.ini 使用 可以用于防跨站配置. .user.ini 注意安全问题 动态加载,默认 5 分钟自动刷新. php 5.3 以后的版本支持. 修改完成后再将文件锁定. 相关链接: 神秘 ...
- 弱网测试—Network-Emulator-Toolkit工具
参考别人网址:http://blog.csdn.net/no1mwb/article/details/53638681 弱网测试,属于健壮性测试:怎么样去做弱网测试呢? 一.安装弱网测试工具-Netw ...
- java项目发布
一.使用eclipse把项目以war格式导出 二.把war文件放在tomcat的webapps中 三.在tomcat的conf文件夹里的server.xml进行配置: 在<Host>< ...
- Jmeter--报错 WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
今天要用Jmeter测试服务器性能,发现GUI界面总是有warning提示: WARNING: Could not open/create prefs root node Software\JavaS ...
- JMeterPlugins插件监听器学习-监听器
JMeterPlugins插件监听器学习-监听器 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表)2.jp@gc - AutoStop List ...
- XE5开发Android程序调用电话相关功能(短信息和电话) [转]
其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...