背景

Java 中区分 Api 和 Spi,通俗的讲:Api 和 Spi 都是相对的概念,他们的差别只在语义上,Api 直接被应用开发人员使用,Spi 被框架扩张人员使用,详细内容可以看:http://www.cnblogs.com/happyframework/p/3325560.html。

Java类库中的实例

代码

1         Class.forName("com.mysql.jdbc.Driver");
2         Connection conn = DriverManager.getConnection(
3                 "jdbc:mysql://localhost:3306/test", "root", "123456");
4         Statement stmt = conn.createStatement();
5
6         ResultSet rs = stmt.executeQuery("select * from Users");

说明

java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。

如何实现这种结构?

代码

 1 public class Program {
 2
 3     public static void main(String[] args) throws InstantiationException,
 4             IllegalAccessException, ClassNotFoundException {
 5         Class.forName("SpiA");
 6
 7         Api api = new Api("a");
 8         api.Send("段光伟");
 9     }
10 }

 1 import java.util.*;
 2
 3 public class Api {
 4     private static HashMap<String, Class<? extends Spi>> spis = new HashMap<String, Class<? extends Spi>>();
 5     private String protocol;
 6
 7     public Api(String protocol) {
 8         this.protocol = protocol;
 9     }
10
11     public void Send(String msg) throws InstantiationException,
12             IllegalAccessException {
13         Spi spi = spis.get(protocol).newInstance();
14
15         spi.send("消息发送开始");
16         spi.send(msg);
17         spi.send("消息发送结束");
18     }
19
20     public static void Register(String protocol, Class<? extends Spi> cls) {
21         spis.put(protocol, cls);
22     }
23 }

1 public interface Spi {
2     void send(String msg);
3 }

 1 public class SpiA implements Spi {
 2     static {
 3         Api.Register("a", SpiA.class);
 4     }
 5
 6     @Override
 7     public void send(String msg) {
 8         System.out.println("SpiA:" + msg);
 9     }
10
11 }

说明

Spi 实现的加载可以使用很多种方式,文中是最基本的方式。

备注

还记得大学期间学习 Java,当时看到 Spi 的开发方式就感觉一个词:不明觉厉。

时间流逝,经验增加,财富增加,幸福也会增加。

转载于:https://www.cnblogs.com/happyframework/p/3349087.html

Java:Spi 小实战相关推荐

  1. 【Java面试】大厂裁员,小厂倒闭,如何搞定面试官Java SPI是什么?有什么用?

    "Java SPI是什么?有什么用?" 这是阿里p6面试过程中,第二面的时候遇到的一个真实的问题. 如果你不理解SPI,建议你看完整篇文章. 大家好,我是Mic,一个工作了14年的 ...

  2. Java并发编程实战————Executor框架与任务执行

    引言 本篇博客介绍通过"执行任务"的机制来设计应用程序时需要掌握的一些知识.所有的内容均提炼自<Java并发编程实战>中第六章的内容. 大多数并发应用程序都是围绕&qu ...

  3. java spi使用详解

    前言 SPI英文全称为Service Provider Interface,顾名思义,服务提供者接口,它是jdk提供给"服务提供厂商"或者"插件开发者"使用的接 ...

  4. java与es8实战之一:以builder pattern开篇

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<java与es8实战>系列 < ...

  5. 渗透小实战 BSPHP验证系统存在未授权访问漏洞

    额,今天工作 打打系统,一个BSPHP验证系统. 这个系统有一个算是中危的未授权访问漏洞,泄露了用户名和用户ID,KEY,登录时间等信息. POC http://127.0.0.1/admin/ind ...

  6. Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  7. java并发编程实战(二)

    java并发编程中常常会用到两种容器来存放一些数据,这些数据需要保证能在多线程下正常访问.常见的容器分为两类:同步容器和并发容器.在java并发编程实战一书中的第五章也有讲解. 什么是同步容器以及优劣 ...

  8. ElasticSearch快速入门(三)=> 集成Spring Boot + 效仿京东搜索小实战

    六.集成Spring Boot 6.1 环境的搭建 新建一个空项目 新建一个spring boot模块 发现导入的默认es依赖和我们本地的es版本不一样 自定义es 的版本 <propertie ...

  9. Esp8266进阶之路⑨ 【小实战上篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  10. java爬虫黑马百度云,Java爬虫小Demo java爬取百度风云榜数据

    Java爬虫小Demo java爬取百度风云榜数据 很简单的一个小例子,使用到了java的爬虫框架 jsoup ,一起啦看看实现的方法吧! 相关推荐:Python爬虫实战 python爬虫爬取百度风云 ...

最新文章

  1. html语言字体是否依赖客户端,【前端面试】HTML5+CSS3初级面试1
  2. 轻量级实用PDF转换工具
  3. 等待 dg597 服务的连接超时
  4. Techparty-广州Javascript技术专场(学习分享)
  5. iscsi-server端配置,以及clients连接。
  6. java 中和_java中的和=是什么意思
  7. python mysql 保存csv_使用Python将csv文件快速转存到Mysql
  8. HDU 1495(非常可乐)
  9. sas sql 读取最后一行数据_SAS基础编程和数据处理
  10. 【Win10】【Win2D】实现控件阴影效果
  11. Linux服务器自动清理缓存
  12. 毕业旅行之天府之国——徒步峨眉
  13. python实现明星专家系统:人脸识别自动比对
  14. npm安装出现npm err FetchError Invalid response body while trying to fetch httpsregistry.npmjs.orgvu
  15. css 预处理器 less sass
  16. 一个springboot 项目a集成另一个springboot 项目b
  17. ngrok域名申请使用外网访问
  18. iOS RSA加密 以及生成公钥 秘钥 pem文件
  19. VB制作网页自动填表(强烈推荐)
  20. 基于cc2530获取ds18b20温度值

热门文章

  1. python tensorflow 智能家居_用GPU加速深度学习: Windows安装CUDA+TensorFlow教程
  2. sublime text3 python找不到文件路径_如何在sublime3 项目设置中设置 python 解释器的路径?...
  3. Linux服务之cobbler批量部署篇
  4. WebService学习之三:spring+cxf整合
  5. 初学knockoutjs记录5——Computed observables依赖监控(2 Writable computed observables可写计算监控属性)...
  6. Winform 中tabcontrol 美化
  7. python marshal 对象序列化和反序列化
  8. 哈哈哈,我来啦~~(纯灌水帖)
  9. 云游戏真的来了,这次的搅局者是 Google,云游戏平台搭建
  10. python 插入查找