ServiceLoader.load方法的函数原型如下

public static <S> ServiceLoader<S> load(Class<S> service)

其doc文档如下:

Creates a new service loader for the given service type, using the current thread's context class loader.
An invocation of this convenience method of the form
ServiceLoader.load(service)
is equivalent to
ServiceLoader.load(service,Thread.currentThread().getContextClassLoader()) Params:
  service – The interface or abstract class representing the service
Returns:
  A new service loader
Inferred annotations:
  @org.jetbrains.annotations.NotNull @org.jetbrains.annotations.Contract("_->new")

翻译后如下:

针对给定的类型,使用当前线程的上下文类加载器,创建一个新的service loader,
ServiceLoader.load(service) 这种简化的调用形式,实际上等同于 ServiceLoader.load(service,Thread.currentThread().getContextClassLoader()) Params:
  service - 表示服务的接口或抽象类 Returns:
  一个新的service loader

我的理解,该方法就是用来加载SPI (Service Provider Interface)

新建一个maven项目,引入mysql依赖包,然后运行以下代码

public class Test {
public static void main(String[] args) {
ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
Iterator<Driver> iterator = loader.iterator();
while (iterator.hasNext()) {
Driver driver = iterator.next();
System.out.println("driver: "+driver.getClass()+", loader: "+driver.getClass().getClassLoader());
} System.out.println("当前线程上下文类加载器: "+Thread.currentThread().getContextClassLoader());
System.out.println("ServiceLoader的累加载器: "+ServiceLoader.class.getClassLoader());
}
}

运行结果

driver: class sun.jdbc.odbc.JdbcOdbcDriver, loader: null
driver: class com.mysql.jdbc.Driver, loader: sun.misc.Launcher$AppClassLoader@1c898b41
当前线程上下文类加载器: sun.misc.Launcher$AppClassLoader@1c898b41
ServiceLoader的累加载器: null

代码中的ServiceLoader和Driver都是JDK自带的类,为何ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);却能加载出MySql的驱动呢?

这其实是SPI的一种规范,在ServiceLoader类的doc文档里有具体说明,以加载mysql驱动为例,实际上规范要求第三方实现在jar包下面必须有META-INF/Service路径的文件夹,内含名为java.sql.Driver的文本文件,该文件名是接口的服务器名,表明该jar包含有的是这一类型服务的实现,文本文件的内容为com.mysql.jdbc.Driver,表明实现类的完全限定名。

【JVM学习笔记】ServiceLoader类的更多相关文章

  1. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  2. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  6. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  9. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  10. JVM学习笔记-JVM模型

    JVM学习笔记 == 标签(空格分隔): jvm 学习笔记全部来自于<深入理解java虚拟机>总结 jvm内存示意图 虚拟机栈(Java Virtual Machine Stacks): ...

随机推荐

  1. SPOJ - AMR11B 判断是否在三角形 正方形 圆形内

    Hogwarts is under attack by the Dark Lord, He-Who-Must-Not-Be-Named. To protect the students, Harry ...

  2. golang docker kubernetes

    不断共建Golang生态.其中比较有代表性的Golang编写软件作品是Docker和Kubernetes.从目前Golang的发展时间和社区活跃度来看,Golang无疑是一门成功的编程语言.

  3. PHP配置文件(php.ini)详解

    [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;; ...

  4. scala-currying化

    scala的加里化(currying)纠结了很久.通过Scala Worksheet 可以打印很多调试信息,所以用它写了一些测试代码,帮助自己理解. object test { //一个参数列表,3个 ...

  5. CSS3 -- 弹性盒

    新版弹性盒 兼容到IE10及以上 flex小游戏 display: flex; 设置为弹性盒(父元素添加) flex-direction 用来来确定主轴的方向,从而确定基本的项目排列方向. 参数 说明 ...

  6. win10 LTSC 2019 激活

    win 10 打开终端 1.slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D 2.slmgr -skms kms.03k.org 3.slmgr -ato 4. slm ...

  7. spark-聚合算子aggregatebykey

    spark-聚合算子aggregatebykey Aggregate the values of each key, using given combine functions and a neutr ...

  8. HTML table 边框双线变单线

    table{border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888 ...

  9. jmeter结果树乱码的解决方案

  10. 多线程 submit与execute区别

    (1)可以接受的任务类型 submit: execute: 可以看出: execute只能接受Runnable类型的任务 submit不管是Runnable还是Callable类型的任务都可以接受,但 ...