欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Bean三級緩存機制的技術(shù)指南

 更新時間: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 的多次初始化,確保線程安全,并提高應(yīng)用程序的啟動性能。

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

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

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

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

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

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

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

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

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

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

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

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

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

以下是 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í)行標(biāo)準(zhǔn)的實例化過程
        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)建和初始化,提高了應(yīng)用程序的啟動速度。

6、總結(jié)

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

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

相關(guān)文章

  • Java創(chuàng)建List常用幾種方法

    Java創(chuàng)建List常用幾種方法

    本文主要介紹了Java創(chuàng)建List常用幾種方法,主要介紹了9種方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java實現(xiàn)的圖像查看器完整實例

    Java實現(xiàn)的圖像查看器完整實例

    這篇文章主要介紹了Java實現(xiàn)的圖像查看器,以完整實例形式較為詳細的分析了java處理圖片的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • java實現(xiàn)題目以及選項亂序的方法實例

    java實現(xiàn)題目以及選項亂序的方法實例

    這篇文章主要給大家介紹了關(guān)于java實現(xiàn)題目以及選項亂序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • idea 修改項目名和module名稱的操作

    idea 修改項目名和module名稱的操作

    這篇文章主要介紹了idea 修改項目名和module名稱的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Spring注解中@Autowired和@Bean的區(qū)別詳解

    Spring注解中@Autowired和@Bean的區(qū)別詳解

    這篇文章主要詳細介紹了Spring注解中@Autowired和@Bean二者有什么區(qū)別,文中通過兩個注解的使用場景介紹了二者的區(qū)別,感興趣的同學(xué)可以參考閱讀
    2023-06-06
  • Spring?Cloud?Gateway整合sentinel?實現(xiàn)流控熔斷的問題

    Spring?Cloud?Gateway整合sentinel?實現(xiàn)流控熔斷的問題

    本文給大家介紹下?spring?cloud?gateway?如何整合?sentinel實現(xiàn)流控熔斷,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友一起看看吧
    2022-02-02
  • IDEA中make directory as的作用及說明

    IDEA中make directory as的作用及說明

    這篇文章主要介紹了IDEA中make directory as的作用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java并發(fā)編程中構(gòu)建自定義同步工具

    Java并發(fā)編程中構(gòu)建自定義同步工具

    這篇文章主要介紹了Java并發(fā)編程中構(gòu)建自定義同步工具,本文講解了可阻塞狀態(tài)依賴操作的結(jié)構(gòu)、有界緩存實現(xiàn)基類示例、阻塞實現(xiàn)方式一:拋異常給調(diào)用者、阻塞實現(xiàn)方式二:通過輪詢和休眠、阻塞實現(xiàn)方式三:條件隊列等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Java.try catch finally 的執(zhí)行順序說明

    Java.try catch finally 的執(zhí)行順序說明

    這篇文章主要介紹了Java.try catch finally 的執(zhí)行順序說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論