java SPI初步
java开发者对API应该很熟悉,程序员自己实现一个接口,然后自己实现,然后把接口开发给其他人使用,这是API。
还有一个东东叫SPI,英文为Service Provider Interface,可以理解为Service提供者接口,大概的逻辑是框架设计者制定一个规范,开发给第三方实现,然后自己使用。
我们日常最常见的应该就是JDBC了,数据库有很多种,java不可能自己都一一实现,于是制定了jdbc规范,由各个数据库厂家实现具体的创建连接、查询数据、返回结果等内容。
SPI机制的约定:
1) 在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名
2) 使用ServiceLoader类动态加载META-INF中的实现类
3) 如SPI的实现类为Jar则需要放在主程序classPath中
4) Api具体实现类必须有一个不带参数的构造方法
比如我们都使用过云盘,如果要开发一个功能,可以运行用户将自己的文件上传到多种不同的云盘上,每个云盘厂商的实现肯定是不同的。
我们只负责定义一个接口:
package com.example.api.plugin; public interface UploadFile { void upload(String var1); }
云盘厂家A想跟我们合作,于是他需要实现自己的上传过程
package com.example.api.plugin; public class UploadFileA implements UploadFile { public UploadFileA() { } public void upload(String fileName) { System.out.println("UploadFileA upload " + fileName); } }
同样云盘厂家B,也需要实现我们的接口
package com.example.api.plugin; public class UploadFileB implements UploadFile { public UploadFileB() { } public void upload(String fileName) { System.out.println("UploadFileB upload " + fileName); } }
他们将自己的代码以jar包的形式共享出来。jar包需要满足META-INF/services/有接口的同名文件,里面是实现类的全名。
当然,在开发的时候这些内容是在Resource目录下的
理论上,我们不知道第三方厂家具体的实现细节,我们只需要调用就可以了。
依赖好第三方jar包,然后我们写一个main方法
public class Main { public static void main(String[] args) { ServiceLoader<UploadFile> uploadCDN = ServiceLoader.load(UploadFile.class); for (UploadFile u : uploadCDN) { u.upload("myFile"); } } }
输出:
UploadFileA upload myFile
UploadFileB upload myFile
完美!
main函数里面也没有啥,最重要的是ServiceLoader,它是jdk提供服务实现查找的一个工具类:java.util.ServiceLoader
这样就可以实现框架与插件的解耦合
原文地址:https://www.cnblogs.com/wangbin2188/p/15246138.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Laravel 在views中加载公共页面的实现代码
- php无限极分类实现方法分析
- PHP从尾到头打印链表实例讲解
- PHP设计模式之外观模式(Facade)入门与应用详解
- PHP实现简单用户登录界面
- 使用python批量修改XML文件中图像的depth值
- PHP数组对象与Json转换操作实例分析
- PHP防止sql注入小技巧之sql预处理原理与实现方法分析
- php实现微信公众号企业转账功能
- 实例分析10个PHP常见安全问题
- laravel清除视图缓存的代码
- Smarty模板类内部原理实例分析
- laravel框架与其他框架的详细对比
- ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写办法
- PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析