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

spring三級(jí)緩存以及為什么不用二級(jí)緩存解讀

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

spring三級(jí)緩存及為什么不用二級(jí)緩存

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

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

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

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

  • 一級(jí)緩存:存放已經(jīng)完全初始化之后的bean,這也是我們?cè)诔绦蚶锩婺玫降腷ean
  • 二級(jí)緩存:存放實(shí)例化完成,但是并沒有進(jìn)行依賴注入和初始化的bean
  • 三級(jí)緩存:bean還沒有進(jìn)行實(shí)例化,單單保存了bean的創(chuàng)建工廠。

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

注意:

  • 當(dāng)B獲得A的引用時(shí),可以晚一點(diǎn)設(shè)置A的屬性。
  • 但是B的構(gòu)造器必須生成,不生成沒東西引用,也就是說B一定要獲取A,即使A還沒設(shè)置屬性也可以。
  • 如果B在A之前實(shí)例化,那么B就會(huì)無法引用A,就會(huì)直接報(bào)錯(cuò)。

這樣在初始化階段就會(huì)進(jìn)行以下流程:

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

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

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

為什么要三級(jí)緩存而不是二級(jí)?

1 避免重復(fù),如果只有1,3兩級(jí)緩存,那么當(dāng)A需要BC 而BC都需要A的時(shí)候,BC就會(huì)同時(shí)調(diào)用A的創(chuàng)建工廠,生成兩份A,導(dǎo)致重復(fù)創(chuàng)建

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

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring-integration連接MQTT全過程

    spring-integration連接MQTT全過程

    這篇文章主要介紹了spring-integration連接MQTT全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 由ArrayList來深入理解Java中的fail-fast機(jī)制

    由ArrayList來深入理解Java中的fail-fast機(jī)制

    fail-fast俗稱快速失敗,是在多線程進(jìn)行迭代操作時(shí)產(chǎn)生沖突的一種異常拋出機(jī)制,下面我們就由ArrayList來深入理解Java中的fail-fast機(jī)制.
    2016-05-05
  • idea如何忽略.iml文件和.idea目錄

    idea如何忽略.iml文件和.idea目錄

    這篇文章主要介紹了idea如何忽略.iml文件和.idea目錄問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 一文梳理Java超大型文件讀取的18種方法和性能

    一文梳理Java超大型文件讀取的18種方法和性能

    這篇文章主要為大家詳細(xì)介紹了Java中超大型文件讀取的18種方法和性能對(duì)比,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Java找出1000以內(nèi)的所有完數(shù)

    Java找出1000以內(nèi)的所有完數(shù)

    一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為 "完數(shù) "。例如6=1+2+3.編程找出1000以內(nèi)的所有完數(shù)
    2017-02-02
  • 一文帶你深入了解Java8 Stream流式編程

    一文帶你深入了解Java8 Stream流式編程

    在實(shí)際項(xiàng)目當(dāng)中,若能熟練使用Java8 的Stream流特性進(jìn)行開發(fā),就比較容易寫出簡(jiǎn)潔優(yōu)雅的代碼。本文主要就是基于實(shí)際項(xiàng)目常用的Stream Api流式處理總結(jié),希望對(duì)大家有所幫助
    2023-04-04
  • JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解

    JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解

    上次我們說到View的Mearsure流程,今天接著說說layout. 關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來看看吧,需要的朋友可以參考下
    2021-05-05
  • Springboot集成JAXB返回xml格式

    Springboot集成JAXB返回xml格式

    這篇文章主要為大家詳細(xì)介紹了Springboot如何集成JAXB返回xml格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 關(guān)于Java數(shù)組聲明、創(chuàng)建、初始化的相關(guān)介紹

    關(guān)于Java數(shù)組聲明、創(chuàng)建、初始化的相關(guān)介紹

    這篇文章主要是關(guān)于Java數(shù)組聲明、創(chuàng)建、初始化的相關(guān)介紹,并給出其對(duì)應(yīng)的代碼,需要的朋友可以參考下
    2015-08-08
  • 淺析SpringBoot2底層注解@Conditional@ImportResource

    淺析SpringBoot2底層注解@Conditional@ImportResource

    這篇文章主要為大家介紹了SpringBoot2底層注解@Conditional@ImportResource的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

巢湖市| 新河县| 赤峰市| 新源县| 永寿县| 分宜县| 公安县| 砀山县| 东台市| 定西市| 海林市| 鹰潭市| 台前县| 三江| 沾化县| 阿尔山市| 南岸区| 镇安县| 澎湖县| 建昌县| 财经| 连云港市| 修武县| 潞城市| 南京市| 崇信县| 禄劝| 富裕县| 乌鲁木齐市| 顺义区| 宝山区| 根河市| 甘泉县| 亚东县| 宁海县| 平利县| 宣恩县| 永春县| 长治市| 平阴县| 涪陵区|