Spring三級緩存

目錄

循環依賴問題

三級緩存

三級緩存創建Bean的流程(解決循環依賴問題)

?三級緩存的局限性


Spring的三級緩存是為了解決單例Bean的循環依賴問題而存在的。

循環依賴問題

簡單來說就是A依賴B,而B又依賴A。即創建A的時候,需要先創建B;但是創建B的時候,需要先創建A。這樣就陷入了死循環,兩個都創建不了。

三級緩存

  • 一級緩存:存儲已經完全初始化的單例Bean
  • 二級緩存:存儲已經實例化但還未初始化的Bean
  • 三級緩存:存儲用于創建Bean的工廠

要理解三級緩存創建Bean的邏輯,首先需要了解Bean的生命周期

  • 實例化(分配內存空間)
  • 填充屬性值(解析依賴關系,注入默認屬性等)
  • 初始化(設置屬性值,執行邏輯等)
    1. 各種Aware通知,如BeanNameAware、BeanFactoryAware等
    2. 執行初始化前置方法
    3. 執行@PostConstruct初始化方法
    4. 執行初始化后置方法
  • 使用Bean
  • 銷毀Bean

(當然在實例化之前,還要進行一些實例化前置處理,這里不討論。)

注意:初始化一定是在填充屬性值的后面,否則可能出現異常(如空指針)

三級緩存創建Bean的流程(解決循環依賴問題)

  1. 創建Bean對象時,首先看一級緩存中是否存在,如果存在,直接使用即可;
  2. 不存在則實例化一個Bean,并通過三級緩存的工廠進行填充屬性和初始化。
  3. 如果這個過程存在循環依賴問題,如A需要注入B,Spring就在三級緩存中實例化B,并把B放到二級緩存中;
  4. A完成初始化后,創建成功,B也可以在二級緩存中完成初始化,并放到一級緩存中。


?三級緩存的局限性

三級緩存僅用來解決單例Bean的循環依賴問題。例如原型Bean的循環依賴就無法通過三級緩存來解決。

如果原型Bean也采用三級緩存的方式,會增加巨大的開銷,因為原型Bean的數量是遠遠多于單例Bean的,而且每個Bean的屬性和狀態都可能有巨大的不同,要存儲這些所有的Bean和對應的工廠,耗費的資源是十分巨大的。雖然可以在一級緩存中移除已經取走的Bean,但是一級緩存是通過一個ConcurrentHashMap來維護的,頻繁的進行移除操作,對性能影響也很大。再者從設計理念上來說,原型Bean是每次創建都獲取到一個新的對象,從緩存中取顯然不滿足這個理念。因此原型Bean的循環依賴問題不適合用三級緩存來解決。事實上,創建原型Bean的時候,如果存在循環依賴的問題,Spring會直接拋異常。

因此在設計上,應該避免使用循環依賴。

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

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

相關文章

【HarmonyOS】【DevEco Studio】ohpm安裝失敗該如何解決?

【關鍵詞】 HarmonyOS、DevEco Studio、ohpm安裝失敗 【問題背景及解決方案】 最近遇到很多DevEco Studio安裝ohpm失敗的問題,下面給大家介紹幾種出現的問題以及解決方案: 1、ohpm not set up,報錯截圖如下: ? 解決方案&…

一百六十、Kettle——Linux上安裝的Kettle9.2.0連接Hive3.1.2

一、目標 Kettle9.2.0在Linux上安裝好后,需要與Hive3.1.2數據庫建立連接 之前已經在本地上用kettle9.2.0連上Hive3.1.2 二、各工具版本 (一)kettle9.2.0 kettle9.2.0安裝包網盤鏈接 鏈接:https://pan.baidu.com/s/15Zq9w…

C++中class嵌套時構造函數,析構函數調用的順序

#include<iostream> using namespace std; class Phone { public:Phone(string pname){m_pnamepname;cout<<"phone的構造函數調用"<<endl;}~Phone(){cout<<"Phone的析構函數調用"<<endl;}string m_pname; }; class Person {…

網安周報|Monti Ransomware團伙推出了一個新的Linux加密器

Monti Ransomware團伙推出了一個新的Linux加密器 經過兩個月的休息&#xff0c;Monti 勒索軟件運營商帶著新的 Linux 版本的加密器返回。該變體被用于針對政府和法律部門組織的攻擊。研究人員注意到兩個團伙的TTP之間有多個相似之處&#xff0c;Monti運營商還基于Conti泄露的源…

2023 Robocom 游記+題解

Robocom賽前一天熬夜打了一場edu,全程瞇瞇眼&#xff0c;三題滾粗了&#xff0c;前三題花了一小時才寫完&#xff0c;第四題寫了一小時也沒寫明白&#xff0c;好像預示著Robocom的結局&#xff1f; 早上七點醒了&#xff0c;感覺自己渾身無力&#xff0c;想睡覺但是又睡不著的…

AutoSAR配置與實踐(基礎篇)3.3 BSW的通信功能

傳送門 -> AUTOSAR配置與實踐總目錄 AutoSAR配置與實踐&#xff08;基礎篇&#xff09;3.3 BSW的通信功能 一、收發過程概覽1.1 發送過程概覽1.2 接收過程概覽 二、BSW的通信功能模塊組成三、收發過程解析3.1 發送過程3.2 發送后的結果確認3.3 接收過程 一、收發過程概覽 1…

Airbnb開源數據可視化工具Visx

一、什么是visx visx 是用于 React 的富有表現力的底層可視化組件集合,結合了 d3 的強大功能來生成可視化,以及 React 更新 DOM 的諸多優勢。 在 Airbnb 內部,visx 的目標是統一整個公司的可視化堆棧,在此過程中,創建了 visx 項目,從而有效的將 D3 的強大功能與 React …

內核調試之devmem直接讀寫寄存器

今天分享一個內核調試實用工具——devmem。 相信很多做底層驅動的人都會經常用到。 什么是devmem&#xff1f; 在Linux系統&#xff0c;如果我們想要訪問某個寄存器&#xff0c;就需要寫一個驅動程序&#xff0c;在驅動中映射寄存器地址&#xff0c;轉為虛擬地址后就可以訪問…

windows電腦系統自帶的畫圖工具如何實現自由拼圖

1.首先選中你要拼接的第一張圖片&#xff0c;右鍵選著編輯&#xff0c;會自動打開自帶的畫圖工具 然后就是打開第一張圖片&#xff0c;如下圖所示 接著就是將畫布托大&#xff0c;如下圖所示。 然后點擊選擇&#xff0c;選擇下面的空白區域&#xff0c;選著區域的范圍要比準備拼…

05-微信小程序常用組件-表單組件

05-微信小程序常用組件-表單組件 文章目錄 表單組件button 按鈕案例代碼 form 表單案例代碼 image 圖片支持長按識別的碼案例代碼 微信小程序包含了六大組件&#xff1a; 視圖容器、 基礎內容、 導航、 表單、 互動和 導航。這些組件可以通過WXML和WXSS進行布局和樣式設…

jQuery第一次接觸

jQuery是一個輕量級js庫 1.下載jquery庫&#xff0c;網址Download jQuery | jQuery npm i jquery 2.還可以從cdn中載入jquery <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> 3.j代表js&#xff0c;query代表查詢&#xff0c;jQu…

超實用的40道JAVA經典算法題(含答案)

作為一名Java程序員&#xff0c;想要拿到一份滿意的offer&#xff0c;就必須做好充足的準備。眾所周知&#xff0c;算法可以說是大廠面試Java程序員的必問題。好的算法可以讓性能得到萬倍提升&#xff0c;做到毫秒級處理千萬數據的程度。因此&#xff0c;算法的重要性不言而喻&…

fedora

about firewall well, I don’t know how to use fedora firewall,but it I come up with that I can use ubuntu’s ufw for blocking evil connection, download wps extremely boredness drove me to install fedora&#xff0c; It can use wps pdf&#xff0c;但我仍然…

PAT 1018 Public Bike Management

個人學習記錄&#xff0c;代碼難免不盡人意。 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Pu…

【實用插件】ArcGIS for AutoCAD插件分享下載

ArcGIS包含一系列功能&#xff0c;其中ArcGIS for AutoCAD一個免費的可下載的AutoCAD插件&#xff0c;它可簡化將CAD和GIS數據整合在一起的過程提供互操作性。 ArcGIS for AutoCAD互操作性平臺將連接AutoCAD和 ArcGIS&#xff0c;以增強使用地理環境設計CAD工程圖時的用戶體驗…

Kubernetes 企業級高可用部署

目錄 1、Kubernetes高可用項目介紹 2、項目架構設計 2.1、項目主機信息 2.2、項目架構圖 2.3、項目實施思路 3、項目實施過程 3.1、系統初始化 3.2、配置部署keepalived服務 3.3、配置部署haproxy服務 3.4、配置部署Docker服務 3.5、部署kubelet kubeadm kubectl工具…

程序員你可長點心吧!代碼檢查你得用

代碼檢查的重要性不言而喻&#xff0c;很多重要的項目都要做代碼的檢查&#xff0c;及時糾正代碼中的錯誤&#xff0c;確保代碼的可讀性、可維護性和可拓展性&#xff0c;從而保證軟件的質量。 一、代碼檢查的定義 代碼檢查是指通過對程序代碼的獨立檢查來提高代碼質量和開發效…

論壇項目之用戶部分

注冊接口 實現思路 1.特殊字段檢查&#xff08;比如性別沒有給出需要給出默認值&#xff09; 2.對比檢查兩次輸入的密碼是否一致&#xff0c;不一致報錯 3.利用UUID生成隨機‘鹽’值&#xff0c;并使用密碼進行MD5加密后與‘鹽’進行拼接&#xff0c;生成加密后的密碼 4.創建U…

什么是P2P?

P2P (Peer-to-Peer) 是一種分布式的網絡架構&#xff0c;其中各個節點&#xff08;通常被稱為“peers”或“節點”&#xff09;直接進行數據共享和交換&#xff0c;而無需依賴中央服務器。P2P 網絡強調平等的參與和共享&#xff0c;每個節點既可以是數據的消費者&#xff08;下…

推進深度融合 打造智慧媒體

以下內容來自于易知微官網&#xff0c;點擊一下&#xff0c;即可進入官網了解詳情。 注意&#xff1a;案例數據均為虛擬數據 數字改革是一場波及經濟社會發展全局、涵蓋生產力到生產關系的全方位變革。在數字化時代&#xff0c;以數字改革賦能媒體深度融合已然成為時代所向、…