什么是双亲委派机制?

什么是双亲委派机制?

Parent Delegation Model ,直译过来可能叫做父级委托模型更容易理解

类的加载过程

  • Java 编译器将 Java源文件编译成.class 文件
  • 再由 JVM 加载 .class 文件到内存中
  • JVM 装载完成后得到一个 Class 字节码对象
  • 拿到字节码对象之后 ,就可以实例化了
  • 类的加载过程需要使用到加载器,JVM 设计了 3 个类加载器 ,分别是 :Bootstrap 类加载器、 Extension 类加载器和 应用类加载器
  • 这些类加载器分别加载不同作用范围的 jar 包和.class 文件
    • Bootstrap ClassLoader ,主要是负责 Java 核心类库的加载 ,也就是 %{JDK_HOME}\lib 下的 rt.jar、resources.jar 等
    • Extension ClassLoader ,主要负责%{JDK_HOME}\lib\ext 目录下的 jar 包和 class 文件
    • Application ClassLoader ,主要负责当前应用里面的 classpath 下的所有 jar 包和类文件
  • 除了系统自己提供的类加载器以外,还可以通过 ClassLoader 类实现自定义加载器,去满足一些特殊场景的需求

双亲委派机制

  1. 双亲委派机制 ,也叫父级委托模型 ,就是指按照类加载器的层级关系 ,逐层进行委派
  2. 我们需要加载一个 class 文件的时候,首先会把这个 class 的查询和加载委派给父加载器去执行
  3. 如果父加载器都无法加载 ,再尝试自己来加载这个 class

意义?

  1. 保证安全性,因为这种层级关系实际上代表的是一种优先级,也就是所有的类的加 载 ,优先给 Bootstrap ClassLoader
  2. 对于核心类库中的类 ,就没办法去破坏, 比如自己写一个 java.lang.String ,最终还是会交给 Bootstrap 类加载器加载,再加上每个类加载器都有不同的作用范围 ,这就意味着自己写的 java.lang.String 没办法去覆盖核心类库中类
  3. 避免重复加载,这种层级关系的设计,可以避免类重复加载导致程序混乱的问题
  4. 即如果父加载器已经加载过了 ,那么子加载器就没必要去加载了

Tomcat的自定义类加载器

Tomcat在初始化的时候自定义了三个类加载器和其他的两个类加载器

  1. CommonLoader:加载Tomcat所需要的jar包和class文件,可以被Tomcat容器本身以及各个Webapp访问;
  2. CatalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
  3. SharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,对于Tomcat不可见;
  4. WebAppClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;
  5. JasperLoader:它出现的目的就是为了被丢弃,加载路径仅仅是某个JSP文件所编译出来的那一个.class文件;

意义?

  1. 隔离同类库不同版本,因为Tomcat是可以部署多个Web应用程序的
  2. 共享同类库同版本,多个应用程序如果依赖相同类库的相同版本,应该共享同类库的同版本,避免重复的类库被加载进JVM
  3. 隔离Tomcat与应用程序的类库,Tomcat也有自己依赖的类库,不能与应用程序的类库冲突
  4. 热部署,修改jsp内容后无需重启项目将它重新加载到内存中,每个jsp对应一个唯一的类加载器,当检测到jsp内容发生更改的时候,直接卸载唯一的类加载器,然后重新创建类加载器,并加载jsp文件。
相关推荐
天若有情67315 分钟前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
qq_5895681020 分钟前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot
JAVA面经实录9171 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
特种加菲猫1 小时前
继承,一场跨越时空的对话
开发语言·c++
AC赳赳老秦1 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
FYKJ_20102 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
玩转单片机与嵌入式2 小时前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
茉莉玫瑰花茶3 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
书源丶3 小时前
三十六、File 类与 IO 流基础——文件操作的「第一步」
java