最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Bean三級緩存機制的技術指南

 更新時間:2025年04月10日 10:13:07   作者:拾荒的小海螺  
在 Spring 框架中,Bean 的創(chuàng)建和管理是容器的核心功能之一,了提高性能,Spring 采用了多級緩存機制來減少不必要的對象創(chuàng)建和配置,本文將詳細介紹 Spring 中 Bean 三級緩存的實現(xiàn)原理,并通過代碼示例幫助你理解這個機制的工作方式,需要的朋友可以參考下

1、簡述

在 Spring 框架中,Bean 的創(chuàng)建和管理是容器的核心功能之一。為了提高性能,Spring 采用了多級緩存機制來減少不必要的對象創(chuàng)建和配置。特別是在 Spring 的單例 Bean 的管理中,三級緩存機制是一個非常重要的優(yōu)化手段。它的目的是減少對 Bean 的多次初始化,確保線程安全,并提高應用程序的啟動性能。

本文將詳細介紹 Spring 中 Bean 三級緩存的實現(xiàn)原理,并通過代碼示例幫助你理解這個機制的工作方式。

2、什么是 Spring Bean 三級緩存?

Spring 的三級緩存是 Spring 容器在創(chuàng)建和管理單例 Bean 時使用的一種緩存機制。它主要用于解決多線程環(huán)境下對同一個 Bean 實例化的并發(fā)問題。Spring 三級緩存分為以下三類:

  • 一級緩存:存儲已經完全初始化的單例 Bean。
  • 二級緩存:存儲已經實例化但尚未完全初始化的 Bean 實例。
  • 三級緩存:存儲待初始化的 Bean 代理對象,通常用于解決 Bean 循環(huán)依賴。

通過三級緩存,Spring 能夠在不同階段緩存 Bean 實例,確保 Bean 在多線程環(huán)境中的安全性,并避免重復的初始化工作。

3、Spring 三級緩存的實現(xiàn)機制

Spring 通過 DefaultSingletonBeanRegistry 類實現(xiàn)了 Bean 的三級緩存。下面是三級緩存機制的具體實現(xiàn)流程。

  • 一級緩存(singletonObjects):存放已完全初始化的單例 Bean。在 Bean 初始化完成后,會被加入一級緩存中,供后續(xù)的調用使用。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
  • 二級緩存earlySingletonObjects):存放已經實例化但未完全初始化的 Bean。當 Spring 處理 Bean 的依賴注入和初始化時,這些 Bean 實例會放入二級緩存。
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
  • 三級緩存singletonFactories):存放待初始化 Bean 的代理工廠。當遇到循環(huán)依賴時,Spring 會創(chuàng)建一個代理對象(通常是 CGLIB 或 JDK 動態(tài)代理)并放入三級緩存中,防止在 Bean 初始化過程中多次創(chuàng)建相同的對象。
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

4、Spring 三級緩存的工作流程

  • 實例化 Bean
    當 Spring 容器啟動時,它會根據(jù) Bean 的配置來決定是否需要實例化該 Bean。實例化的過程是通過 createBean 方法來完成的。

  • 依賴注入與初始化
    在實例化 Bean 后,Spring 會將 Bean 的依賴項注入到 Bean 中(即調用 Bean 的 setter 方法或構造器注入)。隨后,Spring 會執(zhí)行 Bean 的初始化方法。

  • 循環(huán)依賴的解決
    如果 Spring 在初始化 Bean 時發(fā)現(xiàn)該 Bean 存在循環(huán)依賴問題(例如 A 依賴 B,B 又依賴 A),Spring 會通過三級緩存來避免重復的創(chuàng)建過程。具體而言,Spring 會創(chuàng)建一個代理 Bean,并將其放入三級緩存中,確保在循環(huán)依賴的情況下仍能順利完成 Bean 的創(chuàng)建和注入。

  • Bean 完成初始化
    在 Bean 完成初始化后,它會被加入到一級緩存中,表示該 Bean 已經是一個完全初始化的對象。

以下是 Spring 中 Bean 三級緩存的實現(xiàn)代碼示例,演示了 Spring 如何使用三級緩存來解決循環(huán)依賴問題。

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry;
import org.springframework.beans.factory.support.SingletonBeanRegistry;

public class CustomSingletonBeanRegistry extends DefaultSingletonBeanRegistry {

    @Override
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        // 獲取 Bean 時,先嘗試從一級緩存中獲取
        Object singleton = super.getSingleton(beanName);
        if (singleton != null) {
            return singleton;
        }

        // 若一級緩存中沒有,則檢查是否需要從二級緩存中獲取
        if (allowEarlyReference) {
            singleton = earlySingletonObjects.get(beanName);
            if (singleton != null) {
                return singleton;
            }
        }

        // 若二級緩存中也沒有,則從三級緩存(即singletonFactories)中獲取
        singleton = singletonFactories.get(beanName);
        if (singleton != null) {
            return singleton;
        }

        // 如果三級緩存中也沒有,就執(zhí)行標準的實例化過程
        return createBean(beanName);
    }
}

public class BeanLifecycleExample {

    public static void main(String[] args) {
        SingletonBeanRegistry beanRegistry = new CustomSingletonBeanRegistry();
        
        // 模擬一個循環(huán)依賴的情況:A依賴B,B依賴A
        beanRegistry.registerSingleton("A", new A(beanRegistry));
        beanRegistry.registerSingleton("B", new B(beanRegistry));

        A aBean = (A) beanRegistry.getSingleton("A", true);
        System.out.println(aBean);
    }
}

class A {
    private final SingletonBeanRegistry registry;
    
    public A(SingletonBeanRegistry registry) {
        this.registry = registry;
        System.out.println("A bean instantiated");
    }

    public void setB(B b) {
        System.out.println("B injected into A");
    }
}

class B {
    private final SingletonBeanRegistry registry;
    
    public B(SingletonBeanRegistry registry) {
        this.registry = registry;
        System.out.println("B bean instantiated");
    }

    public void setA(A a) {
        System.out.println("A injected into B");
    }
}

在這個例子中,我們創(chuàng)建了 A 和 B 兩個類,它們互相依賴。通過自定義 SingletonBeanRegistry 類,我們可以模擬 Spring 通過三級緩存來解決循環(huán)依賴問題。

5、三級緩存的作用與優(yōu)勢

  • 減少實例化開銷
    Spring 通過緩存已實例化的 Bean 和未完全初始化的 Bean,避免了每次需要獲取 Bean 時都重新實例化。這樣可以減少大量的性能開銷。

  • 解決循環(huán)依賴
    通過三級緩存,Spring 能夠在遇到循環(huán)依賴時,不會無限遞歸地創(chuàng)建 Bean,從而避免了死循環(huán)。三級緩存存儲了 Bean 的代理對象,可以在循環(huán)依賴中起到替代作用。

  • 提高性能
    通過緩存機制,Spring 能夠提高 Bean 的創(chuàng)建效率,尤其是在高并發(fā)環(huán)境下,減少了不必要的對象創(chuàng)建和初始化,提高了應用程序的啟動速度。

6、總結

Spring 的 Bean 三級緩存是一個關鍵的優(yōu)化機制,旨在解決 Bean 實例化過程中的循環(huán)依賴問題,提升性能。它通過將單例 Bean 分為三級緩存(一級緩存、二級緩存、三級緩存)來減少多線程環(huán)境下的實例化開銷,并確保線程安全。理解并掌握 Spring 三級緩存的實現(xiàn)原理,能夠幫助我們更高效地使用 Spring 框架,特別是在處理復雜的依賴關系時。

以上就是Spring Bean三級緩存機制的技術指南的詳細內容,更多關于Spring Bean三級緩存機制的資料請關注腳本之家其它相關文章!

相關文章

  • 解決spring mvc 多數(shù)據(jù)源切換,不支持事務控制的問題

    解決spring mvc 多數(shù)據(jù)源切換,不支持事務控制的問題

    下面小編就為大家?guī)硪黄鉀Qspring mvc 多數(shù)據(jù)源切換,不支持事務控制的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 簡單了解Java刪除字符replaceFirst原理及實例

    簡單了解Java刪除字符replaceFirst原理及實例

    這篇文章主要介紹了簡單了解Java刪除字符replaceFirst原理及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • SpringCloud邁向云原生的步驟

    SpringCloud邁向云原生的步驟

    這篇文章主要介紹了SpringCloud怎么邁向云原生,通過本文我們來梳理一下Spring?Cloud的前世今生,以及未來云原生發(fā)展的趨勢,可以給這些RPC框架的演進帶來一些啟發(fā),感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • RocketMQ消息存儲文件的加載與恢復機制源碼分析

    RocketMQ消息存儲文件的加載與恢復機制源碼分析

    這篇文章主要介紹了RocketMQ源碼分析之消息存儲文件的加載與恢復機制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象

    原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象

    這篇文章主要為大家介紹分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • Java如何正確的使用wait-notify方法你知道嗎

    Java如何正確的使用wait-notify方法你知道嗎

    這篇文章主要為大家詳細介紹了Java如何正確的使用wait-notify方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • spring mvc實現(xiàn)文件上傳并攜帶其他參數(shù)的示例

    spring mvc實現(xiàn)文件上傳并攜帶其他參數(shù)的示例

    本篇文章主要介紹了spring mvc實現(xiàn)文件上傳并攜帶其他參數(shù)的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Springboot中@Transactional注解與異常處理機制方式

    Springboot中@Transactional注解與異常處理機制方式

    這篇文章主要介紹了Springboot中@Transactional注解與異常處理機制方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用Java添加、刪除與預覽Excel分頁符全攻略

    使用Java添加、刪除與預覽Excel分頁符全攻略

    在日常辦公或者數(shù)據(jù)處理場景中,我們經常需要對Excel表格進行分頁操作,通過?Java?操作?Excel,我們可以自動化設置、刪除以及預覽分頁符,大大提升效率,本文將結合實際示例,深入講解如何在Java中使用Spire.XLS庫來管理Excel表格的分頁符,需要的朋友可以參考下
    2026-04-04
  • springboot整合druid及多數(shù)據(jù)源配置的demo

    springboot整合druid及多數(shù)據(jù)源配置的demo

    這篇文章主要介紹了springboot整合druid及多數(shù)據(jù)源配置的demo,本篇主要分兩部分 ①springboot整合druid的代碼配置,以及druid的監(jiān)控頁面演示;②對實際場景中多數(shù)據(jù)源的配置使用進行講解,需要的朋友可以參考下
    2024-01-01

最新評論

象州县| 合江县| 栾川县| 泸定县| 安顺市| 藁城市| 交城县| 清水河县| 枝江市| 富平县| 石首市| 淮滨县| 赤峰市| 锦州市| 沈丘县| 日照市| 乌兰浩特市| 筠连县| 莆田市| 定州市| 大邑县| 潼南县| 榆社县| 平阴县| 台南县| 阿尔山市| 乳源| 宜都市| 井冈山市| 汶上县| 萨嘎县| 三门峡市| 上蔡县| 淮南市| 湘西| 昭通市| 乌鲁木齐县| 和田市| 海林市| 长垣县| 巩义市|