概念

Service Provider Interface

规则

  1. 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名
  2. 接口实现类在classpath路径下
  3. 主程序通过 java.util.ServiceLoader 动态装载实现模块(扫描META-INF/services目录下的配置文件找到实现类,装载到 JVM)

好处

解耦,主程序和实现类之间不用硬编码

例子

package com.mousycoder.mycode.thinking_in_jvm;

/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-16 16:14
*/
public interface SPIService {
void execute();
}
package com.mousycoder.mycode.thinking_in_jvm;

/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-16 16:16
*/
public class SpiImpl1 implements SPIService {
@Override
public void execute() {
System.out.println("SpiImpl1.execute()");
}
}
package com.mousycoder.mycode.thinking_in_jvm;

/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-16 16:16
*/
public class SpiImpl2 implements SPIService {
@Override
public void execute() {
System.out.println("SpiImpl2.execute()");
}
}

在 resources/META-INF/services/目录下创建文件名为com.mousycoder.mycode.thinking_in_jvm.SPIService的文件,内容

com.mousycoder.mycode.thinking_in_jvm.SpiImpl1

com.mousycoder.mycode.thinking_in_jvm.SpiImpl2

主程序

package com.mousycoder.mycode.thinking_in_jvm;

import sun.misc.Service;

import java.util.Iterator;
import java.util.ServiceLoader; /**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-16 16:21
*/
public class SPIMain { public static void main(String[] args) {
Iterator<SPIService> providers = Service.providers(SPIService.class);
ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class); while (providers.hasNext()){
SPIService ser = providers.next();
ser.execute();
} System.out.println("-----------------------");
Iterator<SPIService> iterator = load.iterator();
while (iterator.hasNext()){
SPIService ser = iterator.next();
ser.execute();
}
}
}

输出

SpiImpl1.execute()
SpiImpl2.execute()
-----------------------
SpiImpl1.execute()
SpiImpl2.execute()

【深入浅出-JVM】(77):SPI的更多相关文章

  1. 深入浅出 JVM GC(3)

    # 前言 在 深入浅出 JVM GC(2) 中,我们介绍了一些 GC 算法,GC 名词,同时也留下了一个问题,就是每个 GC 收集器的具体作用.有哪些 GC 收集器呢? Serial 串行收集器(只适 ...

  2. 深入浅出 JVM GC(2)

    # 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲 ...

  3. 深入浅出 JVM ClassLoader

    # 前言 在 JVM 综述里面,我们说,JVM 做了三件事情,Java 程序的内存管理, Java Class 二进制字节流的加载(ClassLoader),Java 程序的执行(执行引擎).我们也说 ...

  4. 阿里架构师带你深入浅出jvm

    本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...

  5. 深入浅出 JVM GC(4)常用 GC 参数介绍

    # 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...

  6. 深入浅出 JVM GC(1)

    # 前言 初级 Java 程序员步入中级程序员的有一个无法绕过的阶段------GC(Garbage Collection).作为 Java 程序员,说实话,很幸福,不用像 C 程序员那样,时刻关心着 ...

  7. 深入浅出JVM

    这篇文章简要解析了JVM的内部结构.下面这幅图展示了一个典型的JVM(符合JVM Specification Java SE 7 Edition)所具备的关键内部组件. 上图展示的所有这些组件都将在下 ...

  8. 对JVM还有什么不懂的?一文章带你深入浅出JVM!

    本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...

  9. 【深入浅出-JVM】(序)

    本系列主要是让一个刚入门的 java 开发者,也能愉快的从零开始成为一个真正的 jvm 大神. 大纲 java 虚拟机的定义.总体架构.常用配置 垃圾回收算法.各类垃圾回收器 java 虚拟机对多线程 ...

随机推荐

  1. 前后端分离后台api接口框架探索

    前言 很久没写文章了,今天有时间,把自己一直以来想说的,写出来,算是一种总结吧!  这篇文章主要说前后端分离模式下(也包括app开发),自己对后台框架和与前端交互的一些理解和看法.     前后端分离 ...

  2. jq css3实现跑马灯+大转盘

    前端效果, <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" con ...

  3. 用 bat 文件实现 excel 周报复制

     又要写周报???? 写周报就算了每次都要改这一大堆的日期,什么鬼嘛,最骚的我还总是有的忘记改....        作为一个正儿八经的程序员,固定每周某天干重复的一件事,哦~~  这是机器人 程序应 ...

  4. Java——反射:运行时的类信息

    RTTI的使用 如果不知道某个对象的确切类型,RTTI会告诉我们,但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的事情.  2.什么情况下需要反射 假设 ...

  5. jupyter iPython web sit use 1

    I want Jupyter to print all the interactive output without resorting to print, not only the last res ...

  6. Django-内置用户系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括 1.用户注册 2.用户登录 3.用户认证 4.注销 5.修改密码 Django作为一个 ...

  7. nodeCZBK-笔记2

    目录 day04 mongoDB数据库使用 day05 node使用mongoDB数据库 day04 mongoDB数据库使用 电脑全局安装数据库 开机命令:mongod --dbpath c:\mo ...

  8. listary的使用心得

    1.关键字里面的 web 不仅仅可以打开网页也可以打开电脑上的应用程序. 2.但是呢,有时候虽然 URL 指向了正确的 exe 但是却打不开相应的软件.这是为什么呢?(有其他方法可以打开) 我在这里提 ...

  9. Servlet Cookie、Session

    HTTP不能保持连接,可使用会话保存用户信息. 常用的会话技术有2种:Cookie.Session. Cookie 1.原理 当用户第一次访问某个网站时,服务器设置Cookie,存储用户信息,放在响应 ...

  10. 【目标检测】RCNN算法详解

    网址: 1. https://blog.csdn.net/zijin0802034/article/details/77685438 (box regression 边框回归) 2. https:// ...