首先简单阐述下什么是SPI:SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。目前有不少框架用它来做服务的扩展发现,简单来说,就是一种动态替换发现的机制。使用SPI机制的优势是实现解耦,使得第三方服务模块的装配控制逻辑与调用者的业务代码分离。

  SPI遵循如下约定:    

    1、当服务提供者提供了接口的一种具体实现后,在META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;

    2、接口实现类所在的jar包放在主程序的classpath中;

    3、主程序通过java.util.ServiceLoader动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;

    4、SPI的实现类必须携带一个无参构造方法;
  
JDK中的SPI具体实践如下:

    1、提供标准服务接口
      

    2、接口实现

      

    3、META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名

      

    4、使用:接口实现类所在的jar包放在主程序的classpath中

      调用实现类的应用pom.xml增加实现类所在jar的依赖:

      

    5、主程序通过java.util.ServiceLoader动态装载实现模块

      

    执行主程序,结果如下:

      

  如果接口实现类所在的jar包不放在主程序的classpath中,执行结果如何?

    对于上述第四步,实现依赖注释

      

    执行主程序后结果如下:

      

    即实现类没有成功加载。

  对于SPI约定中提到的SPI的实现类必须携带一个无参构造方法,在上面的接口实现中并没有提供一个无参的构造函数,可以理解为此种情况默认使用隐式的构造函数。

 

    

最新文章

  1. Django【进阶篇 】
  2. 批判性思维——Asking The Right Questions
  3. java导入excel时遇到的版本问题
  4. C++中不能声明为虚函数的有哪些函数
  5. Python对象初探
  6. MyDetailedOS
  7. c++ string用法
  8. Binary Tree Preorder Traversal on LeetCode in Java
  9. poI地址纠偏查询存储过程理解
  10. C语言队列的实现
  11. 属性property和字段的区别
  12. webview 更新方法细节
  13. reduce/filter/map/zip/isinstance/list列表推导式
  14. [Swift]LeetCode981. 基于时间的键值存储 | Time Based Key-Value Store
  15. nginx禁止ip登录,只允许域名访问
  16. table动态增加删除
  17. ajax里post 设置请求头的编码格式
  18. 清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置
  19. mysql_secure_installation
  20. 3、顺序表、内存、类型、python中的list

热门文章

  1. UVA 156 Ananagrams (STL multimap & set)
  2. 阅读阿里Java开发手册记录
  3. 打开Cmd的方式与基础Dos命令
  4. 额外空间复杂度O(1) 的二叉树遍历 → Morris Traversal,你造吗?
  5. visual studio进行机器学习与python编写
  6. nacos集群开箱搭建
  7. elementui表格里面的索引,多选的复用解决
  8. gin中的多模板和模板继承的用法
  9. 集合框架-工具类-Arrays-asList方法
  10. 只要一行代码,实现五种 CSS 经典布局