美文网首页Java学习资料收集
为什么说SPI打破双亲委派机制

为什么说SPI打破双亲委派机制

作者: 李昂的数字之旅 | 来源:发表于2018-07-04 15:48 被阅读0次

简单介绍ClassLoader的双亲委派机制:

java类通过Classloader加载,Classloader之间有继承关系,AppClassLoader继承ExtClassloader继承BootstrapClassloader。在类加载时,子加载器会调用父加载器来加载类,如果父加载器不能加载类,才会交给子加载器来加载;如果子加载器也加载失败,那么就报异常。

可以看出双亲委派机制是一种至下而上的加载方式,那么SPI是如何打破这种关系?
以JDBC加载驱动为例:
在JDBC4.0之后支持SPI方式加载java.sql.Driver的实现类。SPI实现方式为,通过ServiceLoader.load(Driver.class)方法,去各自实现Driver接口的lib的META-INF/services/java.sql.Driver文件里找到实现类的名字,通过Thread.currentThread().getContextClassLoader()类加载器加载实现类并返回实例。

驱动加载的过程大致如上,那么是在什么地方打破了双亲委派模型呢?

先看下如果不用Thread.currentThread().getContextClassLoader()加载器加载,整个流程会怎么样。

  1. 从META-INF/services/java.sql.Driver文件得到实现类名字DriverA
  2. Class.forName("xx.xx.DriverA")来加载实现类
  3. Class.forName()方法默认使用当前类的ClassLoader,JDBC是在DriverManager类里调用Driver的,当前类也就是DriverManager,它的加载器是BootstrapClassLoader。
  4. 用BootstrapClassLoader去加载非rt.jar包里的类xx.xx.DriverA,就会找不到
  5. 要加载xx.xx.DriverA需要用到AppClassLoader或其他自定义ClassLoader
  6. 最终矛盾出现在,要在BootstrapClassLoader加载的类里,调用AppClassLoader去加载实现类

这样就出现了一个问题:如何在父加载器加载的类中,去调用子加载器去加载类?

  1. jdk提供了两种方式,Thread.currentThread().getContextClassLoader()和ClassLoader.getSystemClassLoader()一般都指向AppClassLoader,他们能加载classpath中的类
  2. SPI则用Thread.currentThread().getContextClassLoader()来加载实现类,实现在核心包里的基础类调用用户代码

相关文章

  • SPI的ClassLoader问题

    问题 为什么说spi服务机制破坏了双亲委派模型? 双亲委派机制 启动类加载器(Bootstrap ClassLoa...

  • 为什么说SPI打破双亲委派机制

    简单介绍ClassLoader的双亲委派机制: java类通过Classloader加载,Classloader之...

  • Java 类加载

    双亲委派模型 并非强制 而是推荐 SPI 父类加载器需要子类加载器加载类 打破双亲委派模型 https://www...

  • 2018-07面试题目

    1. JVM的类加载机制 主要是双亲委派模型的东西。它是什么、怎么工作的、为什么要有它,以及打破双亲委派模型的...

  • 为什么使用双亲委派机制?

    为什么使用双亲委派机制? 专业名词 说双亲委派机制就不得不说类加载器。 引导类加载器:加载%JAVA_HOME%/...

  • 类加载器与双亲委派机制

    前言 什么是类加载器?类加载器有哪些?双亲委派机制是怎么样的?什么时候需要打破双亲委派?如何打破? 以上内容网上有...

  • 3.手写自己的java类加载器

    类的加载过程?何为双亲委派机制?为啥这么设计?实现一个自己的类加载器?如何打破双亲委派机制? 1.类加载器 jar...

  • Tomcat类载入器

    大家都知道,Java的类加载机制是双亲委派模型,那么什么是双亲委派模型呢?我们这里简要的说一下,双亲委派模型...

  • 从类加载开始的JVM学习

    目录 引言 java类加载流程 java类加载机制- 类加载原理- 双亲委派机制 Tomcat中双亲委派机制的应用...

  • 类装载子系统

    ctrl + alt + u 看类继承以及jar包引用图 打破双亲委派机制,只需重写loadclass方法 标量替...

网友评论

    本文标题:为什么说SPI打破双亲委派机制

    本文链接:https://www.haomeiwen.com/subject/dageuftx.html