<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                在Spring框架中,循環依賴的解決是通過“三級緩存”機制來實現的。三級緩存包括: 1. **singletonObjects**:緩存經過了完整生命周期的bean 2. **earlySingletonObjects**:緩存未經過完整生命周期的bean,如果某個bean出現了循環依賴, 就會提前把這個暫時未經過完整生命周期的bean放入earlySingletonObjects中,這個bean如果 要經過AOP,那么就會把代理對象放入earlySingletonObjects中,否則就是把原始對象放入 earlySingletonObjects,但是不管怎么樣,就是是代理對象,代理對象所代理的原始對象也是 沒有經過完整生命周期的,所以放入earlySingletonObjects我們就可以統一認為是未經過完整 生命周期的bean。 3. **singletonFactories**:緩存的是一個ObjectFactory,也就是一個Lambda表達式。在每個Bean 的生成過程中,經過實例化得到一個原始對象后,都會提前基于原始對象暴露一個Lambda表達 式,并保存到三級緩存中,這個Lambda表達式可能用到,也可能用不到,如果當前Bean沒有出 現循環依賴,那么這個Lambda表達式沒用,當前bean按照自己的生命周期正常執行,執行完后 直接把當前bean放入singletonObjects中,如果當前bean在依賴注入時發現出現了循環依賴 (當前正在創建的bean被其他bean依賴了),則從三級緩存中拿到Lambda表達式,并執行 Lambda表達式得到一個對象,并把得到的對象放入二級緩存((如果當前Bean需要AOP,那么 執行lambda表達式,得到就是對應的代理對象,如果無需AOP,則直接得到一個原始對象))。 要理解為什么需要三級緩存,而不僅僅是二級緩存,我們需要深入探討Spring處理循環依賴的過程。 ### 循環依賴的場景 假設存在兩個類 `A` 和 `B`,它們相互依賴: * `A` 依賴 `B`,同時 `B` 也依賴 `A`。 當Spring容器初始化 `A` 時,會檢測到 `A` 依賴 `B`,因此會先去創建 `B`。但在創建 `B` 的過程中,發現 `B` 依賴于 `A`,于是再次去創建 `A`。此時,如果沒有循環依賴的解決機制,會導致循環調用,最終引發棧溢出。 ### 二級緩存的不足 在二級緩存的場景下,`earlySingletonObjects` 存儲的是已經實例化但尚未初始化完成的對象。假設我們只有一級和二級緩存,Spring可能在注入依賴時直接使用二級緩存中的未完全初始化的對象。 **問題在于**: * 如果某個Bean `A`在其依賴注入過程中進行了代理(如AOP場景下需要生成一個代理對象),直接將未代理的 `A` 放入二級緩存中,依賴 `A` 的Bean `B`會得到一個未被代理的原始對象。這會導致代理失效的問題,無法實現預期的功能。 ### 三級緩存的作用 三級緩存的引入解決了上述問題。具體步驟如下: 1. **三級緩存(`singletonFactories`)**:存放的是一個`ObjectFactory`,這個工廠可以在需要的時候創建一個“早期對象”,且這個對象已經是代理后的對象(如果需要的話)。在循環依賴中,Spring首先會從三級緩存中獲取對象。如果需要代理,那么通過這個工廠獲取的對象將是已經代理好的對象。 2. **二級緩存(`earlySingletonObjects`)**:當從三級緩存中獲取到對象后,會將其放入二級緩存,以避免反復調用`ObjectFactory`。 3. **一級緩存(`singletonObjects`)**:對象完全初始化完成后(包括依賴注入、代理處理等),它會被放入一級緩存。 ### 總結 三級緩存比二級緩存多了一個`ObjectFactory`,用于在對象尚未完全初始化時提供早期的代理對象。這樣可以確保在循環依賴的情況下,Spring能夠處理代理對象,并確保各個Bean能獲取到正確的依賴對象。 如果只有二級緩存而沒有三級緩存,無法確保注入到其他Bean中的對象是代理后的對象,導致AOP等功能無法正常工作。因此,三級緩存是必要的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看