Tomcat打破雙親委派模型的方式

文章目錄

  • 1、前言
  • 2、標準的雙親委派模型
  • 3、Tomcat的類加載器架構
  • 4、Tomcat打破雙親委派模型的方式
  • 5、總結

1、前言

雙親委派模型是一種類加載機制,它確保了類加載器層次結構中的父加載器先于子加載器嘗試加載類。這種機制有助于防止類的重復加載和類之間的不兼容。

然而,為了支持Web應用程序的獨立性和隔離性,Tomcat需要在某些情況下打破這一原則。

2、標準的雙親委派模型

在標準的雙親委派模型中,類加載器按以下順序嘗試加載類:

  • Bootstrap ClassLoader:引導類加載器,負責加載Java核心類庫($JAVA_HOME/jre/lib)。
  • Extension ClassLoader:擴展類加載器,負責加載Java擴展庫($JAVA_HOME/jre/lib/ext)。
  • Application ClassLoader:應用類加載器,負責加載應用程序的類路徑(classpath)上的類。

子類加載器在加載類時,先請求父加載器加載,只有當父加載器找不到時,子類加載器才會嘗試自己加載。

3、Tomcat的類加載器架構

Tomcat為了支持多個Web應用程序的獨立性,設計了一套復雜的類加載器架構,主要包括以下幾個類加載器:

  • Bootstrap ClassLoader:加載JVM核心類。
  • System ClassLoader:加載Tomcat自身的類和庫(位于$CATALINA_HOME/lib)。
  • Common ClassLoader:加載共享庫(位于$CATALINA_HOME/lib)。
  • Webapp ClassLoader:每個Web應用都有自己的類加載器,負責加載Web應用程序的類和庫(位于WEB-INF/classes和WEB-INF/lib)。

4、Tomcat打破雙親委派模型的方式

Tomcat通過自定義類加載器的實現,允許Web應用程序在加載類時打破雙親委派模型。這種機制允許Web應用程序優先加載自己的類和庫,而不是依賴父加載器。這種行為主要通過WebappClassLoader來實現。

具體實現:
WebappClassLoader:Tomcat為每個Web應用創建一個WebappClassLoader實例。這個類加載器會首先嘗試從WEB-INF/classes和WEB-INF/lib中加載類,而不是先委派給父加載器。

雙親委派的打破:

當WebappClassLoader加載類時,它會檢查是否在其自己的類路徑中存在。如果存在,它會直接加載,而不是委派給父加載器。

這種機制通過在WebappClassLoader的loadClass方法中覆蓋默認的雙親委派行為實現。

例如:org.apache.catalina.loader.WebappClassLoaderBase類中的findClass方法實現了優先從Web應用程序的類路徑加載類。

示例代碼:
以下是WebappClassLoader如何打破雙親委派模型的簡化示例:

public class WebappClassLoader extends URLClassLoader {private ClassLoader parent;public WebappClassLoader(URL[] urls, ClassLoader parent) {super(urls, null); // 將父加載器設置為nullthis.parent = parent;}@Overridepublic Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {// 首先,檢查是否已經加載了類Class<?> clazz = findLoadedClass(name);if (clazz == null) {try {// 嘗試從Web應用的類路徑中加載類clazz = findClass(name);} catch (ClassNotFoundException e) {// 如果找不到,再委派給父加載器加載clazz = parent.loadClass(name);}}if (resolve) {resolveClass(clazz);}return clazz;}
}

在這個示例中,WebappClassLoader首先嘗試通過findClass方法加載類,如果找不到再委派給父加載器。這種方式打破了雙親委派模型,使得Web應用程序可以優先加載自己的類。

5、總結

Tomcat通過自定義的WebappClassLoader打破了雙親委派模型,允許Web應用程序優先加載自己的類和資源。這種機制確保了每個Web應用程序的獨立性和隔離性,避免了類庫沖突,并使得每個應用程序可以擁有自己的類和庫版本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43415.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL數據庫基本操作-DDL和DML

1. DDL解釋 DDL(Data Definition Language)&#xff0c;數據定義語言&#xff0c;該語言部分包括以下內容&#xff1a; 對數據庫的常用操作對表結構的常用操作修改表結構 2. 對數據庫的常用操作 功能SQL查看所有的數據庫show databases&#xff1b;查看有印象的數據庫show d…

16 - Python語言進階

Python語言進階 數據結構和算法 算法&#xff1a;解決問題的方法和步驟 評價算法的好壞&#xff1a;漸近時間復雜度和漸近空間復雜度。 漸近時間復雜度的大O標記&#xff1a; - 常量時間復雜度 - 布隆過濾器 / 哈希存儲 - 對數時間復雜度 - 折半查找&#xff08;二分查找&am…

關于TCP的三次握手流程

三次握手流程 第一次握手&#xff1a;客戶端向服務端發起建立連接請求&#xff0c;客戶端會隨機生成一個起始序列號x&#xff0c;客戶端向服務端發送的字段包含標志位SYN1&#xff0c;序列號segx。第一次握手后客戶端的狀態為SYN-SENT。此時服務端的狀態為LISTEN 第二次握手&…

使用耳機殼UV樹脂制作私模定制耳塞的價格如何呢?

使用耳機殼UV樹脂制作私模定制耳塞的價格如何呢&#xff1f; 耳機殼UV樹脂制作私模定制耳塞的價格因多個因素而異&#xff0c;如材料、工藝、設計、定制復雜度等。 根據我目前所了解到的信息&#xff0c;使用UV樹脂制作私模定制耳塞的價格可能在數百元至數千元不等。具體價格…

LVS+Nginx高可用集群---Nginx進階與實戰

1.Nginx中解決跨域問題 兩個站點的域名不一樣&#xff0c;就會有一個跨域問題。 跨域問題&#xff1a;了解同源策略&#xff1a;協議&#xff0c;域名&#xff0c;端口號都相同&#xff0c;只要有一個不相同那么就是非同源。 CORS全稱Cross-Origin Resource Sharing&#xff…

大模型知識大全1-基礎知識【大模型】

文章目錄 大模型簡介以后的介紹流程基礎知識訓練流程介紹pre-train對齊和指令微調規模拓展涌現能力 系統學習大模型的記錄https://github.com/LLMBook-zh/LLMBook-zh.github.io 大模型簡介 歷史我就不寫了&#xff0c;簡單說說大模型的應用和特點。人類使用大模型其實分為兩個…

linux高級編程(OSI/UDP(用戶數據報))

OSI七層模型&#xff1a; OSI 模型 --> 開放系統互聯模型 --> 分為7層&#xff1a; 理想模型 --> 尚未實現 1.應用層 QQ 應用程序的接口 2.表示層 加密解密 gzip 將接收的數據進行解釋&#xff…

【shell】—雙引號引用變量

文章目錄 一、舉例—單、雙引號引用變量的結果差異二、使用雙引號引用變量的場景1、使用雙引號—可以防止字符串被分割2、使用雙引號—特殊字符變為普通字符3、使用雙引號—保存原始命令的輸出格式4、使用雙引號—具有強約束的單引號變為普通單引號字符5、注意 一、舉例—單、雙…

挑戰杯 opencv python 深度學習垃圾圖像分類系統

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; opencv python 深度學習垃圾分類系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;4分 這是一個較為新穎的競…

昇思25天學習打卡營第13天|應用實踐之ResNet50遷移學習

基本介紹 今日的應用實踐的模型是計算機實踐領域中十分出名的模型----ResNet模型。ResNet是一種殘差網絡結構&#xff0c;它通過引入“殘差學習”的概念來解決隨著網絡深度增加時訓練困難的問題&#xff0c;從而能夠訓練更深的網絡結構。現很多網絡極深的模型或多或少都受此影響…

數據鏈路層(超詳細)

引言 數據鏈路層是計算機網絡協議棧中的第二層&#xff0c;位于物理層之上&#xff0c;負責在相鄰節點之間的可靠數據傳輸。數據鏈路層使用的信道主要有兩種類型&#xff1a;點對點信道和廣播信道。點對點信道是指一對一的通信方式&#xff0c;而廣播信道則是一對多的通信方式…

算法工程師第五天(● 哈希表理論基礎 ● 242.有效的字母異位詞 ● 349. 兩個數組的交集 ● 202. 快樂數● 1. 兩數之和 )

參考文獻 代碼隨想錄 一、有效的字母異位詞 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 示例 1: 輸入: s "anagram", …

風險評估:Tomcat的安全配置,Tomcat安全基線檢查加固

「作者簡介」&#xff1a;冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎著作 《網絡安全自學教程》&#xff0c;適合基礎薄弱的同學系統化的學習網絡安全&#xff0c;用最短的時間掌握最核心的技術。 這一章節我們需…

grafana數據展示

目錄 一、安裝步驟 二、如何添加喜歡的界面 三、自動添加注冊客戶端主機 一、安裝步驟 啟動成功后 可以查看端口3000是否啟動 如果啟動了就在瀏覽器輸入IP地址&#xff1a;3000 賬號密碼默認是admin 然后點擊 log in 第一次會讓你修改密碼 根據自定義密碼然后就能登錄到界面…

高職物聯網實訓室

一、高職物聯網實訓室建設背景 隨著《中華人民共和國國民經濟和社會發展第十四個五年規劃和2035年遠景目標綱要》的發布&#xff0c;中國正式步入加速數字化轉型的新時代。在數字化浪潮中&#xff0c;物聯網技術作為連接物理世界與數字世界的橋梁&#xff0c;其重要性日益凸顯…

Golang | Leetcode Golang題解之第224題基本計算器

題目&#xff1a; 題解&#xff1a; func calculate(s string) (ans int) {ops : []int{1}sign : 1n : len(s)for i : 0; i < n; {switch s[i] {case :icase :sign ops[len(ops)-1]icase -:sign -ops[len(ops)-1]icase (:ops append(ops, sign)icase ):ops ops[:len(o…

Knife4j的原理及應用詳解(三)

本系列文章簡介&#xff1a; 在當今快速發展的軟件開發領域&#xff0c;API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;作為不同軟件應用之間通信的橋梁&#xff0c;其重要性日益凸顯。隨著微服務架構的興起&#xff0c;API的數量…

價值投資者什么時候賣出股票?

經常有人說&#xff0c;會買的只是徒弟&#xff0c;會賣的才是師傅。 在閱讀《戰勝華爾街》的過程中&#xff0c;也多次感受到林奇先生的賣出邏輯&#xff0c;當股票的價格充分體現了公司的價值的時候&#xff0c;就是該賣出股票的時候。但這只是理論上的&#xff0c;從林奇先…

數據中臺指標管理系統

您所描述的是一個數據中臺指標管理系統&#xff0c;它基于Spring Cloud技術棧構建。數據中臺是企業數據管理和應用的中心平臺&#xff0c;它整合了企業內外部的數據資源&#xff0c;提供數據服務和數據管理能力。以下是您提到的各個模塊的簡要概述&#xff1a; 1. **首頁**&am…