小标
2018-12-19
来源 :
阅读 1262
评论 0
摘要:本文主要向大家介绍了JDK源码分析——Java语言的SPI机制分析与实战,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本文主要向大家介绍了JDK源码分析——Java语言的SPI机制分析与实战,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
JDK源码分析——Java的SPI机制分析与实战,前一段时间公司内部领导希望我们目前的产品的后台开发使用微服务,让我们调研分析一下,与此同时有朋友公司在使用dubbo,所以打算看看dubbo。
首先去dubbo的官网看一下官网的文档,文档描述的很详细,对dubbo的整体的架构、运维部署、扩展机制等都做了详细的介绍。并提出如何使用Java开发出稳定产品的一些心得体会,这些心得体会让我深有同感,所以推荐大家也去看看,另外还强烈推荐把《Effective Java》反复研读。
在了解了dubbo的框架和设计顺便下载了dubbo的源码看了之后呢,里面有一个spi机制在之前没有接触过,通过查看java的官方文档了解到这种机制也是java提供的一种可扩展的一种编程机制,通过这种机制类似于插件机制,非常方便程序的扩展。
SPI机制分析
如果英文好而且又对Java理解的很深的,可以直接查看oracle的官网的介绍https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html ,在该篇文章中对什么是spi、spi的优点、如何开发自己的spi都进行详细的介绍。本篇文章将按照官方的文档,设计并测试相应的spi实例,并通过接口和spi对比测试来区分两者之间的区别。
首先我们定义一个HelloService的接口,并编写两个实现类,类的关系如下图所示
HelloService.java
package com.mh.JavaExample.spi.imp;
/**
* SPI机制分析实例
* Start at: 2018/5/1 16:14
*
* @author muhong
*/
public interface HelloService {
void sayHello();
}
ChinaHelloService.java
package com.mh.JavaExample.spi.imp;
/**
* 中国式的招呼
* Start at: 2018/5/1 16:17
*
* @author muhong
*/
public class ChinaHelloService implements HelloService {
@Override
public void sayHello() {
System.out.println("你好,世界!");
}
}
AmericaHelloService.java
package com.mh.JavaExample.spi.imp;
/**
* 美国式的招呼
* Start at: 2018/5/1 16:18
*
* @author muhong
*/
public class AmericaHelloService implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello world!");
}
}
接口测试:
在我们平常编程的时候,我们使用统一接口自定义实现的方式进行扩展,下面是基于接口的实现方式:
package com.mh.JavaExample.spi;
import com.mh.JavaExample.spi.imp.AmericaHelloService;
import com.mh.JavaExample.spi.imp.ChinaHelloService;
import com.mh.JavaExample.spi.imp.HelloService;
import org.junit.Test;
/**
* 测试接口
* Start at: 2018/5/1 16:22
*
* @author muhong
*/
public class TestMain {
@Test
public void testInterface(){
HelloService ch = new ChinaHelloService();
ch.sayHello();
HelloService en = new AmericaHelloService();
en.sayHello();
}
}
基于SPI的扩展的测试
package com.mh.JavaExample.spi;
import org.junit.Test;
import java.util.Iterator;
import java.util.ServiceLoader;
/**
* 测试SPI
* 关于SPI的jar包的打包方式,可以参考oracle的官网说明:https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html
* 本次SPI的测试jar包也是参考该说明打包的:
* 1、和spi相关的class文件拷贝到一个临时目录下/tmp(用户自定创建,和打包无关)
* 2、在该目录下创建META-INF目录,在META-INF目录下创建services目录,在目录下创建com.mh.JavaExample.spi.HelloService文件
* 3、在该文件中输入SPI接口的名字,如com.mh.JavaExample.spi.AmericaHelloService
* 4、进入到临时根目录/tmp中,执行命令jar cvf AmericaHelloService.jar -C . .
* 5、在该根目录下就可以看到AmericaHelloService.jar了
* Start at: 2018/5/1 17:25
*
* @author muhong
*/
public class TestMain2 {
@Test
public void testSpi(){
ServiceLoader<helloservice> services = ServiceLoader.load(HelloService.class);
for (Iterator<helloservice> iterator = services.iterator(); iterator.hasNext(); ) {
HelloService helloService = iterator.next();
helloService.sayHello();
}
}
}
</helloservice></helloservice>
源码分析
相关的源码我已经放到github上了,下面是和该实例相关的类和jar包,通过分析运行这些类和jar包可以对该机制有深入的了解,下面是代码结构图:
在上面的圈中的文件中:
test目录下的spi.imp中的代码文件是用于接口测试的。<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPtTabGli1tC1xMj9uPZqYXKw/MrH08PT2nNwabLiytS1xKOsxuTW0EhlbGxvU2VydmljZS5qYXLKx8r009q907/asPyjrENoaW5hSGVsbG9TZXJ2aWNlLmphcrrNQW1lcmljYUhlbGxvU2VydmljZS5qYXLKx1NQSbXEyrXP1sDgo6yx4NC0tPKw/LXEuPHKvcjnz8KjujxiciAvPg0KPGltZyBhbHQ9"SPI的jar包结构" src="/uploadfile/Collfiles/20180502/20180502094756763.png" title=""https://book.2cto.com" target="_blank" class="keylink">阅读oracle官方的介绍,可以完成自定义spi的开发,如果英文不是特别好的朋友,可以先查阅相关的博客资料,然后结合我的代码去调试即可有深入的了解。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号