文档章节

Java SPI

Percy-Dreams
 Percy-Dreams
发布于 2015/10/21 16:57
字数 454
阅读 291
收藏 9

Java SPI

概念

     Java规范SPI全称为 (Service Provider Interface) ,是JDK内置的一种服务提供自发现机制。

简述

        很多框架都是使用这种规范,commons-logging, JDBC各个驱动厂商,还有就是阿里巴巴的Dubbo框架,但是Dubbo中说的需要注意的地方,详细细节看源码。我简述一下,作者意思官方的SPI在使用第三方的static变量时候,如果没有显示依赖这个组件,编译不能通过,这就限制了微内核,API和SPI分离的特性。所以Dubbo做法是自己写了一个ExtensionLoader去加载@SPI(这个是Dubbo内部定义的注解)注解的实现类。这样就可以解决了上述的问题。

文档

http://cailin.iteye.com/blog/2243672

http://singleant.iteye.com/blog/1497259

http://blog.csdn.net/unei66/article/details/47051017

具体做法我不在一一赘述,我写无非也是这样。

示例

        最终我想给大家演示的,代码在Github上,供大家来借鉴。我演示了多模块项目,其实在具体实现中每个模块代表了每个不同厂商实现,非常清晰展示了SPI的用法。相信代码是最好的示例。

        最终给大家说明最重要的一点就是JDK默认扫描的路径就是CLASSPATH下

META-INF/services/

目录下名称与接口名称相同的文件


        最后,项目的地址为:

        https://github.com/Percy0601/training-spi

总结

        这种方式好处,就是让API和SPI分离了,接口和实现的分离,简化了接口开发,在总结一句就是类似的IOC容器,甚至可以把这个当做Spring类似的IOC框架来使用它。

        https://github.com/Percy0601/training-spi

© 著作权归作者所有

共有 人打赏支持
Percy-Dreams
粉丝 11
博文 21
码字总数 6280
作品 1
朝阳
JDK源码之ClassLoader

Java类加载器ClassLoader总结 JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 2.显式装载, 通过class.for...

村长大神
2014/03/27
0
0
Dubbo的SPI实现以及与JDK实现的区别

在 Java 里, 为了规范开发,制定了大量的「规范」与「标准」,这些上层的内容,大多是以接口的形式提供出来。那这些接口最终实现是谁呢,在哪里呢? 规范并不关心这个。 所谓规范,是指定了...

小红牛
06/28
0
0
Java的classloader

类加载器的基本概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被...

huzorro
2012/12/18
0
0
CDI(Weld)整合整合JavaEE环境组件资源

除了基础部分和高级部分,CDI的第三个主题是整合。 CDI还设计了通过SPI提供集成点到Java EE平台的协同工作的平台之外的技术[在Java EE 6发布后,各种各样的Java EE平台扩展(构建在CDI扩展SPI之...

Zhao-Qian
2014/05/18
0
2
聊聊Dubbo - Dubbo可扩展机制实战

摘要: 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能...

阿里云云栖社区
06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
21
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部