深入理解Spring框架中三級緩存運作機制

一、什麼是Spring框架中的三級緩存

Spring框架中的三級緩存指的是“單例對象池”,它是Spring框架中對單例對象進行緩存的機制,可以提高應用程序的性能。它包含了三個緩存層次:

  • singletonObjects:緩存已經實例化的單例對象。
  • earlySingletonObjects:緩存正在創建中的單例對象,這些對象對應的bean還未執行完構造函數、初始化方法等操作。
  • singletonFactories:緩存的是ObjectFactory類型的對象。對於“原型範圍”的Bean實例,為了保證每次都能新建一個,只能使用對象工廠進行Bean的初始化。

三層緩存按照優先級逐漸降低。

下面我們將深入理解三級緩存的運作機制。

二、Spring框架三級緩存的運作機制

1、緩存依賴注入(DI)

當程序啟動時,Spring容器會讀取所有配置的Bean信息,將它們加入到緩存中。而當程序需要一個Bean時,容器就會直接從緩存中獲取這個Bean,而不是重新創建一個。在獲取Bean的過程中,容器遇到依賴注入的需求時,會從緩存中依次查找對應的Bean是否已經存在,如果已經存在,則直接返回,如果不存在,則創建這個Bean,並將其添加到緩存中。

2、緩存初始化

在容器初始化時,會把所有singleton類型的Bean都加入到singletonObjects緩存中,此時singletonFactories緩存為空。當需要獲取一個Bean時,會先從singletonObjects緩存中尋找,如果找不到,會創建一個新的實例,並且存儲在earlySingletonObjects緩存中,至此,對象就形成了一個單例工廠模型。在實例創建完成後,會將其從earlySingletonObjects移動到singletonObjects緩存中。

3、延遲加載初始化

當Bean是通過延遲加載方式(例如:@Lazy)初始化時,在容器初次啟動時,該Bean只被加入到singletonFactories緩存中。

當程序需要獲取該Bean時,Spring會查找該Bean是否已經創建過了。如果還未創建,它會從singletonFactories緩存中獲取ObjectFactory對象,並調用getObject()方法獲取該Bean,並且形成一個單例工廠模型。最後把Bean放入earlySingletonObjects緩存中,等待繼續完成創建和初始化。如果該Bean已經創建了,那麼放回緩存中已經存在的同一個實例。

4、一個案例

為了更好的理解三級緩存工作機制,下面帶着案例來說明:

public class App {
   public static void main(String[] args) {
      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
      context.register(AppConfig.class);

      System.out.println("------容器啟動完成------");
      ((Student)context.getBean("student")).say();
      ((Student)context.getBean("student")).say();
      ((Student)context.getBean("student")).say();
   }
}

@Configuration
public class AppConfig {
   @Bean(name="student")
   @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
   public Student getStudent() {
      System.out.println("------singletonFactories------");
      return new Student();
   }
}

class Student{
    int age = 1;
    public void say(){
        System.out.println(age);
        age++;
    }
}

運行後的結果為:

------容器啟動完成------
------singletonFactories------
1
2
3

在上面的例子中,註解了@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON),將參數設置成單例模式,按照上述的三層緩存邏輯,當請求student Bean時,將在三級別緩存中依次查找,同時在對象工廠緩存中創建bean,並放入earlySingletonObjects緩存中,當構造完成後,即調用Student Bean的初始化方法後,將該對象裝入singletonObjects緩存中,等待進一步的操作。

三、總結

理解Spring框架的三級緩存的運行機制可以幫助我們更好地使用Spring框架,提高應用程序的性能。三級緩存是Spring框架中對單例對象進行緩存的機制,包含了singletonObjects、earlySingletonObjects和singletonFactories三層緩存。在獲取Bean的過程中,容器遇到依賴注入的需求時,會從緩存中依次查找對應的Bean是否已經存在,如果已經存在,則直接返回,如果不存在,則創建這個Bean,並將其添加到緩存中。通過三層緩存的方式,Spring實現了Bean的單例模式,有效避免了因頻繁創建和銷毀Bean對象而造成的系統性能問題。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/288765.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 03:00
下一篇 2024-12-24 03:00

相關推薦

  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Zlios——一個多功能的開發框架

    你是否在開發過程中常常遇到同樣的問題,需要不斷去尋找解決方案?你是否想要一個多功能、易於使用的開發框架來解決這些問題?那麼,Zlios就是你需要的框架。 一、簡介 Zlios是一個…

    編程 2025-04-29
  • agavi開發框架

    Agavi是一個基於MVC模式的Web應用程序開發框架,以REST和面向資源的設計為核心思想。本文章將從Agavi的概念、優點、使用方法和實例等方面進行詳細介紹。 一、概念 Aga…

    編程 2025-04-29
  • Python unittest框架用法介紹

    Python unittest框架是Python自帶的一種測試框架,可以用來編寫並運行測試用例。在本文中,我們將從以下幾個方面詳細介紹Python unittest框架的使用方法和…

    編程 2025-04-29
  • com.alipay.sofa.bolt框架

    com.alipay.sofa.bolt框架是一款高性能、輕量級、可擴展的RPC框架。其廣泛被應用於阿里集團內部服務以及阿里雲上的服務。該框架通過NIO支持高並發,同時還內置了多種…

    編程 2025-04-29
  • Python 數據緩存及其應用

    本文將為大家詳細介紹Python數據緩存,並提供相關代碼示例。 一、Python 數據緩存基礎概念 Python 是一種解釋型語言,每次執行完一條語句後就會將內存中的結果清空,如果…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網絡應用中流…

    編程 2025-04-29
  • Django框架:從簡介到項目實戰

    本文將從Django的介紹,以及如何搭建Django環境開始,逐步深入到Django模型、視圖、模板、表單,最後通過一個小型項目實戰,進行綜合性的應用,讓讀者獲得更深入的學習。 一…

    編程 2025-04-28
  • LuaEP:一款強大的Lua開發框架

    LuaEP是一個集成了可以快速開發web應用程序所需的組件的Lua開發框架。它以Lua語言為基礎,提供了許多常用接口和庫,使得開發者不需要從頭開始編寫web應用程序,而是專註於業務…

    編程 2025-04-28
  • Java持久層框架的複合主鍵實現

    用Java持久層框架來操作數據庫時,複合主鍵是常見的需求。這篇文章將詳細闡述javax.persistence複合主鍵的實現方式,並提供完整的示例代碼。 一、複合主鍵的定義 複合主…

    編程 2025-04-27

發表回復

登錄後才能評論