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的简单应用,网上例子很多,大同小异,本人觉 ...
随机推荐
- ACM-ICPC 2018 徐州赛区网络预赛(9.9)
#include<bits/stdc++.h> #define int long long using namespace std; ; ; ]; int quick(int a,int ...
- 《DSP using MATLAB》Problem 6.18
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...
- window.location.herf=url参数有中文,到后台乱码问题解决
js中的代码: /*将中文的参数进行两次编码 */ function queryByName(){ //获取查询条件的用户名 ...
- CSVN备份初体验
备份方法挺多的,目前我知道有四种 其一: 首先复制旧csvn服务器上repositories下的版本库文件夹到新csvn服务器repositories文件夹下面(做以下修改时最好把csvn服务停掉) ...
- Android中控制Dialog呈现的时间
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zinss26914/article/details/36900157 用线程控制dialog的呈现时 ...
- 深入详解美团点评CAT跨语言服务监控(二) CAT服务端初始化
Cat模块 Cat-client : cat客户端,编译后生成 cat-client-2.0.0.jar ,用户可以通过它来向cat-home上报统一格式的日志信息,可以集成到 mybatis.spr ...
- java 中 heap(堆)和stack(栈)的区别
总结在Java里面Heap和Stack分别存储数据的不同. 区别项 Heap(堆) Stack(栈) JVM中的功能 内存数据区 内存指令区 存储数据 对象实例(注1) 基本数据类型, 指令代码,常量 ...
- idea的svn安装
https://blog.csdn.net/qq_27093465/article/details/74898489
- secureCRT 设置证书免密登陆
1 第一步 2 第二步 3 第三步 4 第4 步 ,然后选择你的 私钥文件