Dubbo等框架使用到必须掌握。

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

package org.hadoop.java;public interface IService {public String sayHello();      public String getScheme();
}
package org.hadoop.java;public class HDFSService implements IService {@Overridepublic String sayHello() {return "Hello HDFS!!";}@Overridepublic String getScheme() {return "hdfs";}
}
package org.hadoop.java;public class LocalService implements IService {@Overridepublic String sayHello() {return "Hello Local!!";}@Overridepublic String getScheme() {return "local";}}
package org.hadoop.java;import java.util.ServiceLoader;public class ServiceLoaderTest {public static void main(String[] args) {  //need to define related class full name in /META-INF/services/....  ServiceLoader<IService> serviceLoader = ServiceLoader.load(IService.class);  for (IService service : serviceLoader) {System.out.println(service.getScheme()+"="+service.sayHello());  }  }
}

需要在项目的\src\main\resources\下增加services目录,然后再增加一个文件这个文件是前面的接口的包名+接口名,例如:org.hadoop.java.IService

整个项目

输出:

------------------------------------------------------------------------
Building SPITest 1.0-SNAPSHOT
--------------------------------------------------------------------------- exec-maven-plugin:1.2.1:exec (default-cli) @ SPITest ---
hdfs=Hello HDFS!!
local=Hello Local!!
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 0.570s
Finished at: Mon Mar 27 20:45:01 CST 2017
Final Memory: 5M/123M
------------------------------------------------------------------------

参考:设计原则:小议 SPI 和 API

Java spi机制浅谈

java中的SPI机制

1 SPI机制简介
SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java spi机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。
2 SPI具体约定
java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk提供服务实现查找的一个工具类:java.util.ServiceLoader

java.util.ServiceLoader使用

今天在看Hadoop源代的时候发现,在FileSystem中用到了Java.util.ServiceLoader这个类来从配置文件中加载子类或者接口的实现类。以前从来没有使用过这个类,进去大概看了一下具体的实现。主要是从META-INF/services这个目录下的配置文件加载给定接口或者基类的实现,ServiceLoader会根据给定的类的full name来在META-INF/services下面找对应的文件,在这个文件中定义了所有这个类的子类或者接口的实现类,返回一个实例。

Java的SPI机制相关推荐

  1. 高级开发必须理解的Java中SPI机制

    本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践.学习开源项目提供参考. 1 SPI是什么 SPI全称Service Provider Interface ...

  2. Java之SPI机制

    之前开阿里的HSF框架,里面用到了Java的SPI机制,今天闲暇的时候去了解了一下,通过写博客来记录一下 SPI的全名为Service Provider Interface,我对于该机制的理解是为接口 ...

  3. 深入了解Java的SPI机制

    导语   SPI的全名叫做Service Provider Interface,在java.util.ServiceLoader的文档中有详细的介绍,下面就来通过简单的例子实现SPI深入了解   我们 ...

  4. 【java】SPI机制详解

    1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...

  5. JDK源码分析——Java的SPI机制分析与实战

    重点提示:在我博客中的所有的源码分析的实例,我都将会放到github上,感兴趣的朋友可以下载下来调试运行,我相信还是可以有所收获的.我的目的是让所有读到我博客的朋友都可以了解到有价值的东西,学习到ja ...

  6. java实践SPI机制及浅析源码

    1.概念 正式步入今天的核心内容之前,溪源先给大家介绍一下关于SPI机制的相关概念,最后会提供实践源代码. SPI即Service Provider Interface,属于JDK内置的一种动态的服务 ...

  7. JAVA的SPI机制究竟是什么玩意儿?为什么要有?怎么使用呢?

    SPI是什么玩意儿: SPI:全名为Service Provider Interface,我对于该机制的理解是为接口寻找服务实现类.现在公司的系统都是进行了模块的划分,系统抽象为多个模块,往往有很多不 ...

  8. java中spi机制解读

    关于spi机制大部分人都很陌生,因为我们在开发过程中很少用到,但是实际上这个机制从我们接触java开始就跟我们如影随形.有些人认为使用java很简单,都是调用第三方依赖包,然后结合自己的业务逻辑就可以 ...

  9. 我崩溃了!月薪30K必须掌握的开源项目Java中SPI机制

    前言 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 是 Spring 家族中的一个安全管理框架,提供了一套 Web 应用安全性的完整解决方案.在用户认证 ...

最新文章

  1. angular路由传递参数_@medux 路由篇
  2. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-目录
  3. mysql事务未提交读_mysql事务之未提交读Read uncommitted(仅学习)
  4. iOS8开发~UI布局(一)初探Size Class
  5. kernel32.dll出错解决方案
  6. 自动增量字段重新从1开始的方法
  7. 不同包之间的继承extends
  8. CGAL中Point的引用
  9. 程序员小技巧-----如何提升电脑速度
  10. git rm 和 rm 的区别
  11. java 导出word 带图片
  12. Android系统权限和root权限
  13. MySQL之子查询优化
  14. 关于数学中“函数(function)”的含义
  15. java波斯王子武者之心,波斯王子2:武者之心通关攻略
  16. jmeter逻辑控制器之如果(if)控制器实战(二)
  17. 正在走进现实的“飞行汽车”,能否颠覆地面交通?
  18. mysql using temporary_执行计划中Using filesort,Using temporary相关语句的优化解决_MySQL
  19. 【目标检测】MMDetection的安装与基础使用
  20. 快手616战报首发,次抛精华引新浪潮,快品牌跃入热榜top3

热门文章

  1. 如何使用postman测试流文件_干货|如何用Postman做集成测试
  2. 获取oracle数据库war报告,Oracle 数据库开发及SQL基础实战
  3. linux内核 机器码,u-boot与Linux内核机器码问题
  4. 归并排序(代码注释超详细)
  5. Windows下Eclipse配置基于MinGW的C/C++开发环境
  6. Java h265视频抽帧提取照片支持Window,Linux
  7. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数
  8. FT(Fourier Transform)在滤波上的应用
  9. C++ 函数参数传递:传值,传指针,传引用
  10. LabVIEW OCR 实现车牌识别(实战篇—3)