亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

spring三級緩存以及為什么不用二級緩存解讀

 更新時間:2025年02月19日 11:19:30   作者:nodelaynow  
Spring三級緩存機制解決了循環(huán)依賴問題,通過一級緩存存放完全初始化的bean,二級緩存存放實例化但未完成依賴注入和初始化的bean,三級緩存存放bean的創(chuàng)建工廠,避免了重復創(chuàng)建和確保代理對象的正確生成

spring三級緩存及為什么不用二級緩存

spring是如何使用三級緩存解決循環(huán)依賴的呢?

首先 我們以下討論的bean都不是多例的,多例的bean不存在緩存當中,因此spring是無法解決多例bean的循環(huán)依賴的。

我們知道bean的初始化過程分為三步:實例化,依賴注入,初始化。

首先讓我們來看看三級緩存里面各存了些什么:

  • 一級緩存:存放已經完全初始化之后的bean,這也是我們在程序里面拿到的bean
  • 二級緩存:存放實例化完成,但是并沒有進行依賴注入和初始化的bean
  • 三級緩存:bean還沒有進行實例化,單單保存了bean的創(chuàng)建工廠。

這種緩存機制能夠幫我們解決這樣一種循環(huán)依賴:A在B之前進行實例化,并且A需要setter注入B,B需構造器注入A(或者屬性注入A)。

注意:

  • 當B獲得A的引用時,可以晚一點設置A的屬性。
  • 但是B的構造器必須生成,不生成沒東西引用,也就是說B一定要獲取A,即使A還沒設置屬性也可以。
  • 如果B在A之前實例化,那么B就會無法引用A,就會直接報錯。

這樣在初始化階段就會進行以下流程:

1:A要進行初始化,先實例化,先將A的創(chuàng)建工廠放在三級緩存中,然而A在自己的屬性注入里面發(fā)現(xiàn)B還沒有出現(xiàn),于是先去初始化B

2:B要進行初始化,先實例化,先把B的創(chuàng)建工廠放在三級緩存種,然后B發(fā)現(xiàn)自己的屬性注入需要A,去一級找不到A,二級找不到A,在三級找到到了A的創(chuàng)建工廠,于是調用創(chuàng)建工廠的getobject()方法創(chuàng)建一個A的實例化對象(如果A實現(xiàn)了aop,那么就是創(chuàng)建的 A的代理對象),放入二級緩存并且添加入自己的構造器/屬性(可以允許A屬性晚點設置,但是不能沒有),這樣B就可以完成自己的初始化,初始化完成之后放入一級緩存并且刪掉二三級B緩存

3:B的初始化完成了,A繼續(xù)屬性賦值,順利從?級緩存拿到實例化且初始化完成的B對象,A對象創(chuàng)建也完成,刪除?級緩存中的A,同時把A放??級緩存

為什么要三級緩存而不是二級?

1 避免重復,如果只有1,3兩級緩存,那么當A需要BC 而BC都需要A的時候,BC就會同時調用A的創(chuàng)建工廠,生成兩份A,導致重復創(chuàng)建

2 spring希望代理和bean的生命周期要分開,如果一開始就直接調用創(chuàng)建工廠創(chuàng)建bean的話,那么所有擁有aop的bean就會直接進行動態(tài)代理,但是spring希望在bean完成初始化之后再生成最終代理。如果不分開的話,也就是說不需要3級緩存,1級存放bean,2級存放實例化后的bean,所有的bean直接調用創(chuàng)建工廠創(chuàng)建并且放在二級緩存,那么也是沒問題的。

采用三級緩存,在這個過程中如果B需要A注入,而A存在代理的話,那么就會生成一個早期的代理對象給B,用于解決循環(huán)依賴,而最終的代理對象還是要在beanA完成了屬性填充和初始化后再繼續(xù)進行,這兩個生成的代理對象是存在區(qū)別的,因此也不算真正破壞到Spring代理在Bean初始化完成后的原則,因為Spring仍然確保了最終的代理對象是在Bean完全初始化后才生成的。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 基于Gradle搭建Spring?5.3.13-release源碼閱讀環(huán)境的詳細流程

    基于Gradle搭建Spring?5.3.13-release源碼閱讀環(huán)境的詳細流程

    這篇文章主要介紹了基于Gradle搭建Spring?5.3.13-release源碼閱讀環(huán)境,首先安裝jdk、gradle等一系列必要操作,本文通過實例代碼相結合給大家講解的非常詳細,需要的朋友可以參考下
    2022-04-04
  • springSecurity之AuthenticationProvider用法解析

    springSecurity之AuthenticationProvider用法解析

    這篇文章主要介紹了springSecurity之AuthenticationProvider用法解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Jersey Restful接口如何獲取參數(shù)的問題

    Jersey Restful接口如何獲取參數(shù)的問題

    這篇文章主要介紹了Jersey Restful接口如何獲取參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JAVA超級簡單的爬蟲實例講解

    JAVA超級簡單的爬蟲實例講解

    下面小編就為大家?guī)硪黄狫AVA超級簡單的爬蟲實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • java中簡單的截取分割字符串實例

    java中簡單的截取分割字符串實例

    下面小編就為大家?guī)硪黄猨ava中簡單的截取分割字符串實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Spring boot整合shiro+jwt實現(xiàn)前后端分離

    Spring boot整合shiro+jwt實現(xiàn)前后端分離

    這篇文章主要為大家詳細介紹了Spring boot整合shiro+jwt實現(xiàn)前后端分離,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java高效利用異常處理的技巧總結

    Java高效利用異常處理的技巧總結

    這篇文章主要為大家詳細介紹了Java如何高效利用異常處理,從而達到優(yōu)化代碼的效果,文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下
    2023-09-09
  • 最新版Spring Security中的路徑匹配方案

    最新版Spring Security中的路徑匹配方案

    在 Spring Security 中,路徑匹配是權限控制的核心部分,它決定了哪些請求可以訪問特定的資源,本文將詳細介紹 Spring Security 中的路徑匹配策略,并提供相應的代碼示例,需要的朋友可以參考下
    2024-04-04
  • 基于java中的PO VO DAO BO POJO(詳解)

    基于java中的PO VO DAO BO POJO(詳解)

    下面小編就為大家?guī)硪黄趈ava中的PO VO DAO BO POJO(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot無法訪問webapp目錄下的文件問題

    SpringBoot無法訪問webapp目錄下的文件問題

    這篇文章主要介紹了SpringBoot無法訪問webapp目錄下的文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論