Java:Spi 小实战
背景
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 小实战相关推荐
- 【Java面试】大厂裁员,小厂倒闭,如何搞定面试官Java SPI是什么?有什么用?
"Java SPI是什么?有什么用?" 这是阿里p6面试过程中,第二面的时候遇到的一个真实的问题. 如果你不理解SPI,建议你看完整篇文章. 大家好,我是Mic,一个工作了14年的 ...
- Java并发编程实战————Executor框架与任务执行
引言 本篇博客介绍通过"执行任务"的机制来设计应用程序时需要掌握的一些知识.所有的内容均提炼自<Java并发编程实战>中第六章的内容. 大多数并发应用程序都是围绕&qu ...
- java spi使用详解
前言 SPI英文全称为Service Provider Interface,顾名思义,服务提供者接口,它是jdk提供给"服务提供厂商"或者"插件开发者"使用的接 ...
- java与es8实战之一:以builder pattern开篇
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<java与es8实战>系列 < ...
- 渗透小实战 BSPHP验证系统存在未授权访问漏洞
额,今天工作 打打系统,一个BSPHP验证系统. 这个系统有一个算是中危的未授权访问漏洞,泄露了用户名和用户ID,KEY,登录时间等信息. POC http://127.0.0.1/admin/ind ...
- Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- java并发编程实战(二)
java并发编程中常常会用到两种容器来存放一些数据,这些数据需要保证能在多线程下正常访问.常见的容器分为两类:同步容器和并发容器.在java并发编程实战一书中的第五章也有讲解. 什么是同步容器以及优劣 ...
- ElasticSearch快速入门(三)=> 集成Spring Boot + 效仿京东搜索小实战
六.集成Spring Boot 6.1 环境的搭建 新建一个空项目 新建一个spring boot模块 发现导入的默认es依赖和我们本地的es版本不一样 自定义es 的版本 <propertie ...
- Esp8266进阶之路⑨ 【小实战上篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- java爬虫黑马百度云,Java爬虫小Demo java爬取百度风云榜数据
Java爬虫小Demo java爬取百度风云榜数据 很简单的一个小例子,使用到了java的爬虫框架 jsoup ,一起啦看看实现的方法吧! 相关推荐:Python爬虫实战 python爬虫爬取百度风云 ...
最新文章
- html语言字体是否依赖客户端,【前端面试】HTML5+CSS3初级面试1
- 轻量级实用PDF转换工具
- 等待 dg597 服务的连接超时
- Techparty-广州Javascript技术专场(学习分享)
- iscsi-server端配置,以及clients连接。
- java 中和_java中的和=是什么意思
- python mysql 保存csv_使用Python将csv文件快速转存到Mysql
- HDU 1495(非常可乐)
- sas sql 读取最后一行数据_SAS基础编程和数据处理
- 【Win10】【Win2D】实现控件阴影效果
- Linux服务器自动清理缓存
- 毕业旅行之天府之国——徒步峨眉
- python实现明星专家系统:人脸识别自动比对
- npm安装出现npm err FetchError Invalid response body while trying to fetch httpsregistry.npmjs.orgvu
- css 预处理器 less sass
- 一个springboot 项目a集成另一个springboot 项目b
- ngrok域名申请使用外网访问
- iOS RSA加密 以及生成公钥 秘钥 pem文件
- VB制作网页自动填表(强烈推荐)
- 基于cc2530获取ds18b20温度值
热门文章
- python tensorflow 智能家居_用GPU加速深度学习: Windows安装CUDA+TensorFlow教程
- sublime text3 python找不到文件路径_如何在sublime3 项目设置中设置 python 解释器的路径?...
- Linux服务之cobbler批量部署篇
- WebService学习之三:spring+cxf整合
- 初学knockoutjs记录5——Computed observables依赖监控(2 Writable computed observables可写计算监控属性)...
- Winform 中tabcontrol 美化
- python marshal 对象序列化和反序列化
- 哈哈哈,我来啦~~(纯灌水帖)
- 云游戏真的来了,这次的搅局者是 Google,云游戏平台搭建
- python 插入查找