前言
在JVM专栏的第一篇:我们讲了什么是双亲委派模型,以及为什么需要双亲委派模型。还没看过的大佬,有钱没钱都捧个人场,点它: 你能说出jvm的类加载是什么吗
同时还了解到这样设计是为了保持JVM整个体系的稳定。但在某些场景下,稳定恰恰是一种掣肘,我们需要的是打破这种模型(好像有点标题党了)。
接下来我们就来一一简单介绍下打破双亲委派模型的多个企业级应用
。
JDBC-SPI
打破背景
为了更加灵活的连接数据库,我们的JDK定义了Driver
接口,需要与数据库进行连接的包必须实现该接口。例如:MySQL,建议去观察下项目中mysql-connector
包,下面就有实现类的全限定类名。
打破原因
在上述背景下,执行 DriverManager
类的方法时,需要去加载实现类。还记得我们第一篇文章讲的 BootStrapClassLoader
吗,它只能加载rt.jar
下的类。而MySQL的加载路径隶属于AppClassLoader
,所以理论上它压根就不能被加载。
于是线程上下文类加载器就应运而生,由于ThreadClassLoader
一般情况下==AppClassLoader
。于是通过线程上下文类加载器加载JDBC实现类,打破了双亲委派模型,顺利实现功能。
源码解读
- 查看DriverMana