jvm类加载器

说道类加载器、双亲委派模型可能都能说出一两点,那就说点有意思的部分,不再深挖概念。

基础简单过一下

(1)类加载器是加载 Java 应用所需的所有资源,不仅包括class文件,还有文本、图像、配置文件、视频等等各类资源

(2)JVM 中内置了三个重要的 ClassLoader(注意下:各自一某三分地)

  1. BootstrapClassLoader(启动类加载器):最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jarresources.jarcharsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。(jdk9加载java.base)
  2. ExtensionClassLoader(扩展类加载器):主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。(jdk9名字成了平台类加载器)
  3. AppClassLoader(应用程序类加载器):面向开发的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

(3)双亲委派模型(代码位置: java.lang.ClassLoader 的 loadClass() 中)

在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则把这个请求委派给父类加载器loadClass()方法来加载类。最终,所有的请求最终都会传送到顶层的启动类加载器 BootstrapClassLoader 中,只有当父加载器表示无法完成这个加载请求时,子加载器才会尝试调用自己的 findClass() 方法来加载类,如果子类加载器也无法加载这个类,它会抛出一个 ClassNotFoundException 异常.

(4)破坏双亲委派模型

场景:1:实现了 Spring 提供的接口需要用Spring 提供的注解,SharedClassLoader需要加载子类加载器WebAppClassLoader的资源, 使用线程上下文加载器ThreadContextClassLoader

           2:SPI接口,如:driver,jdk提供接口,三方提供实现,双亲委派没法加载,就可以使用配置文件等方式,Jvm会根据这个配置问题件完成实现类的加载

SPI(Service Provider Interface)是Java中一种服务提供接口的机制,允许第三方实现提供自己的服务实现。在Java中,一些标准的API,比如`java.sql.Driver`接口,使用了SPI机制。

`java.sql.Driver`接口是所有JDBC驱动程序需要实现的接口,它允许开发者通过标准的方式连接和操作数据库。在SPI机制中,`java.sql.Driver`定义了接口规范,而具体数据库厂商的驱动实现类则通过在classpath中提供特定的配置文件(`META-INF/services/java.sql.Driver`)来声明自己的实现。JVM在启动时会查找这些配置文件,并加载对应的实现类,这样就实现了动态加载和使用第三方数据库驱动的能力。

META-INF/services/java.sql.Driver文件中的内容:

com.mysql.cj.jdbc.Driver

通过SPI机制,Java标准库定义了接口,允许第三方实现特定的功能,而不需要直接修改Java标准库的代码。这种松耦合的设计允许开发者根据需要动态地选择和加载第三方服务提供者的实现,从而增强了系统的可扩展性和灵活性。

总的来说,SPI机制允许了在Java中定义接口规范,并通过配置和动态加载的方式允许第三方提供对接口的实现,这为Java的扩展和插件化提供了非常方便的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值