Java的SPI机制
Dubbo等框架使用到必须掌握。
java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。
package org.hadoop.java;public interface IService {public String sayHello(); public String getScheme();
}
package org.hadoop.java;public class HDFSService implements IService {@Overridepublic String sayHello() {return "Hello HDFS!!";}@Overridepublic String getScheme() {return "hdfs";}
}
package org.hadoop.java;public class LocalService implements IService {@Overridepublic String sayHello() {return "Hello Local!!";}@Overridepublic String getScheme() {return "local";}}
package org.hadoop.java;import java.util.ServiceLoader;public class ServiceLoaderTest {public static void main(String[] args) { //need to define related class full name in /META-INF/services/.... ServiceLoader<IService> serviceLoader = ServiceLoader.load(IService.class); for (IService service : serviceLoader) {System.out.println(service.getScheme()+"="+service.sayHello()); } }
}
需要在项目的\src\main\resources\下增加services目录,然后再增加一个文件这个文件是前面的接口的包名+接口名,例如:org.hadoop.java.IService
整个项目
输出:
------------------------------------------------------------------------
Building SPITest 1.0-SNAPSHOT
--------------------------------------------------------------------------- exec-maven-plugin:1.2.1:exec (default-cli) @ SPITest ---
hdfs=Hello HDFS!!
local=Hello Local!!
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 0.570s
Finished at: Mon Mar 27 20:45:01 CST 2017
Final Memory: 5M/123M
------------------------------------------------------------------------
参考:设计原则:小议 SPI 和 API
Java spi机制浅谈
java中的SPI机制
1 SPI机制简介
SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java spi机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。
2 SPI具体约定
java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk提供服务实现查找的一个工具类:java.util.ServiceLoader
java.util.ServiceLoader使用
今天在看Hadoop源代的时候发现,在FileSystem中用到了Java.util.ServiceLoader这个类来从配置文件中加载子类或者接口的实现类。以前从来没有使用过这个类,进去大概看了一下具体的实现。主要是从META-INF/services这个目录下的配置文件加载给定接口或者基类的实现,ServiceLoader会根据给定的类的full name来在META-INF/services下面找对应的文件,在这个文件中定义了所有这个类的子类或者接口的实现类,返回一个实例。
相关文章:

你不知道的对称密钥与非对称密钥
(一)对称加密(Symmetric Cryptography) 对称密钥加密,又称私钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,对…

linux sntp 代码,C语言window(linux)平台的SNTP实现
C语言实现window(linux)平台的SNTP,本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码:unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client3, Server4) */unsigned char stratum; /* 时间层级 (0-1…

在typescript中导入第三方类库import报错
问题 最近开始折腾typescript,在使用第三方类库,比如最常见的lodash,采用常规方法导入 import * as _ from lodashvscode中报错提示lodash不是module。 原因 因为第三方类库并没有ts的声明文件,查阅网上资料,有typings…
JavaAgent 实现字节码注入
新建MyAgent项目 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…

php打印中文乱码
php文档的文本格式都设置成 utf-8 格式 在代码中添加 header("content-type:text/html; charsetutf-8"); 转载于:https://www.cnblogs.com/negro-guoguo/p/5421355.html

linux孤立cpu,Linux 抛弃旧款 CPU,一下子少 50 万行代码
IT 之家4 月 3 日消息 Linux 内核维护者已经决定在即将发布的新版本中抛弃对旧款 CPU 架构的支持,因此 Linux 4.17 内核将减少大约 500000 行代码,根据 Linux 统计器,目前它包含大约 2030 万行代码。IT 之家报道,将被弃用的体系架…

CSS3 从头捋
1.border-radius 边界半径 作用:该属性用来实现圆角 示例1实现圆角 div {border:2px solid red;width:300px;border-radius:25px; } 示例2实现圆 div {border: 1px solid red;height: 100px;width: 100px;border-radius: 50%; } 示例3 不规则圆 div {border: 1px s…

算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen
算法:详解布隆过滤器的原理、使用场景和注意事项知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可…

linux shell显示下载进度,shell脚本测试下载速度
在linux下用shell来测试下载速度,很实用的shell代码。代码:复制代码 代码示例:#!/bin/bash#date:20140210# edit: www.jquerycn.cn#used for test server download speedr_host"188.18.28.19"r_dir"/home/test0208/tmp"r_file"…

openStack调试
openStack调试 posted on 2016-04-23 22:07 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ruiy/p/5425823.html

快应用开发常见问题以及解决方案【持续更新】
接触快应用也有一段时间了,踩过了大大小小的坑,让我活到了今天。准备在此立贴持续更新,记录遇到的问题以及解决方案,造福大众。css 方面 1、文字竖排不支持 目前官方还不支持writing-mode,除了等待官方支持这个api以外…

Java字节码研究
关于怎么查看字节码的五种方法参考本人另一篇文章《Java以及IDEA下查看字节码的五种方法》 1.String和常连池 先上代码: public class TestApp {public static void main(String[] args) {String s1 "abc";String s2 new String("abc");St…

在c语言中逗号的作用,关于c语言中的逗号运算符???
等下。。答错了。。还需要理解一下神马是逗号表达式。。我前面说的和uuyyhhjj与delta_charlie的意思一样,但其实我们都搞错了。你可以自己把我们的例子都运行一下,看看是不是这样。下面我感觉应该是我正确的理解。逗号表达式是所有运算符中优先级最低的&…

2018-2019-1 20165206 《信息安全系统设计基础》第4周学习总结
- 2018-2019-1 20165206 《信息安全系统设计基础》第4周学习总结 - 教材学习内容总结 程序员可见的状态:Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分,这称为程序员可见状态。包括:程序寄存器、条件码、程序状态、程序计数器和…

PHP——图片上传
图片上传 Index.php文件代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><form action"upload2.php" method"p…

IDEA实用插件和技巧
《解决lambda expressions are not supported at this language level的问题》 《Intellij Idea 代码格式化/保存时自动格式化》 一、安装google-java-format preferences -> plugins -> Browse repositories… 搜索google-java-format 还有阿里的代码规范插件也不…

c语言将字母与数字分开存放,2017年计算机二级《C语言》考前提分试题及答案9...
二、程序填空题(共18分)、下列给定程序中,函数flm的功能是:将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的次序。例如,s所指的字符串为“def35adh3kjsdt7”,执行后结果为…

学术青年如何克服拖延症——5条技巧助你前进
雷锋网 AI 科技评论按:「我准备好了就开始」(或者说「拖延症」),以及「即便动起手来也觉得举步维艰」大概是每个现代人都逃不过的日常感受,不管是学习、在企业中工作,还是从事学术研究。我们可能都看过许多…
JDK源码研究Jstack,JMap,threaddump,dumpheap的原理
JDK最新bug和任务领取:https://bugs.openjdk.java.net/projects/JDK/issues 参加OpenJDK社区:https://bugs.openjdk.java.net/projects/JDK/issues openjdk源码地址: https://jdk.java.net/java-se-ri/8 https://download.java.net/openj…

C语言中regex_error,为什么这个C 11 std :: regex示例抛出一个regex_error异常?
参见英文答案 >Is gcc 4.8 or earlier buggy about regular expressions? 2尝试学习如何在C 11中使用新的std :: regex.但是我尝试的例子是抛出一个我不明白的regex_error异常.这是我的示例代码:#include #include int main…

如何删除mac通用二进制文件
通用二进制文件是什么? 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序…

约瑟夫环 猴子选大王
<? /*** 猴子选大王:一群猴子排成一圈,按1,2,…,n依次编号。* 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,* 如此不停的进行下去,直…
Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现
关于怎么查看字节码的五种方法参考本人另一篇文章《Java以及IDEA下查看字节码的五种方法》 查看汇编语言汇编码 说要看汇编还是很有必要的,因为有些地方比如加锁其实还是通过汇编实现的,只看字节码不能看出底层实现。 其实就是利用使用hsdis与jitwat…

云计算读书笔记(五)
Hadoop:Google云计算的开源实现 Hadoop是Apache开源组织的一个分布式计算机框架,可以在大量廉价的硬件设备组成的集群上运行应用程序,为应用程序提供一组稳定可靠的接口,旨在构建一个具有高可靠性和良好扩展性的分布式系统。 Hado…

自动跟随小车c语言,基于OpenCV的智能小车运动轨迹跟踪方法研究
摘要:随着人工智能技术的快速发展,智能小车开发受到越来越多研究者的关注,也已经成为一个重要的研究方向,而解决智能小车在路径规划中行驶的运动故障重要手段是对其进行的视频监控,但是智能小车的视频监控只能看到智能小车的行进状况而不进行相对应的处理,所以对智能…

JXJJOI2018_T1_market
题目描述 某天Lemon去超市买柠檬,他发现货架上有N个柠檬,每个柠檬都有一个重量Wi和价格Ci。 Lemon身上只带了S元钱,因此他想要买一个价格不超过S的柠檬回家,另外,他希望他买的那个柠檬的性价比尽量高。 性价比的定义是…

更好的Java虚拟机Zing: 更好的性能,无停顿,更快的启动
Zing虚拟机文档Understanding Java Garbage Collection(了解Java垃圾收集) 首先说明这个Zing是收费的,但是他也是优秀的,我觉得我们可以研究下他的一些思想对于怎么提高JVM,以及目前的JVM有什么缺陷是非常有帮助的。 中文版简介:…

c语言将水仙花数放入一维数组a中,全国计算机等级考试C语言考试程序设计题(13)...
在考生目录下,要求程序PROG.C的功能是:将所有的水仙花数保存到一维数组a中。(所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:1531*1*15*5*53*3*3)#includevoid main(){void NONO( );//函数声明int a[10]{0},i…

[j2me]类似于OperaMini二级菜单界面演练[1]
拜朋友所赐,今日开始尝试如何绘制类似于Opera Mini的二级菜单,如下图所示:我自己的练习,还很幼稚,姑且记录如下:点击左软键,即可选中界面左下角的“选择”命令,二级菜单旋即弹出&…