乱人伦 国语对白海角社区,五月激情丁香婷婷综合中文字幕,欧美伊人婷婷久久五月综合,亚洲精品无amm毛片,亚洲男人第一无码AV网站,国产日韩欧美丝袜一区二区,亚洲一区精品在线观看

Spring压轴题:当循环依赖遇上Spring AOP-国民彩票苹果APP下载

Spring压轴题:当循环依赖遇上Spring AOP

2026-01-18 02:29:19投稿人:IM體育手機(jī)官網(wǎng)下載網(wǎng)站(仙桃)有限公司圍觀363 評(píng)論

Spring壓軸題:當(dāng)循環(huán)依賴遇上Spring AOP

前言

:Spring如何解決循環(huán)依賴?

 :Spring通過提前曝光機(jī)制,利用三級(jí)緩存解決循環(huán)依賴(這原理還是挺簡單的,參考 :三級(jí)緩存  、圖解循環(huán)依賴原理)

再問 :Spring通過提前曝光,直接曝光到二級(jí)緩存已經(jīng)可以解決循環(huán)依賴問題了 ,為什么一定要三級(jí)緩存?

再細(xì)問 :如果循環(huán)依賴的時(shí)候 ,所有類又都需要Spring AOP自動(dòng)代理 ,那Spring如何提前曝光?曝光的是原始bean還是代理后的bean?

這些問題算是Spring源碼的壓軸題了 ,如果這些問題都弄明白 ,恭喜你順利結(jié)業(yè)Spring源碼了。就單單對(duì)Spring這一塊的理解 ,不夸張的說可以達(dá)到阿里水準(zhǔn)了

源碼分析

進(jìn)入正題 ,在Spring創(chuàng)建Bean的核心代碼doGetBean中 ,在實(shí)例化bean之前 ,會(huì)先嘗試從三級(jí)緩存獲取bean ,這也是Spring解決循環(huán)依賴的開始

(一) 緩存中獲取bean

// AbstractBeanFactory.javaprotected T doGetBean(final String name, @Nullable final ClassrequiredType,   @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {   final String beanName = transformedBeanName(name);  Object bean;  // 2. 嘗試從緩存中獲取bean  Object sharedInstance = getSingleton(beanName);  ...}

protected Object getSingleton(String beanName, boolean allowEarlyReference) {   // 從一級(jí)緩存獲取,key=beanName value=bean  Object singletonObject = this.singletonObjects.get(beanName);  if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {    synchronized (this.singletonObjects) {     // 從二級(jí)緩存獲取,key=beanName value=bean    singletonObject = this.earlySingletonObjects.get(beanName);    // 是否允許循環(huán)引用    if (singletonObject == null && allowEarlyReference) {      /**      * 三級(jí)緩存獲取,key=beanName value=objectFactory	
,objectFactory中存儲(chǔ)getObject()方法用于獲取提前曝光的實(shí)例      *      * 而為什么不直接將實(shí)例緩存到二級(jí)緩存	,而要多此一舉將實(shí)例先封裝到objectFactory中?      * 主要關(guān)鍵點(diǎn)在getObject()方法并非直接返回實(shí)例,而是對(duì)實(shí)例又使用      * SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法對(duì)bean進(jìn)行處理      *      * 也就是說,當(dāng)spring中存在該后置處理器,所有的單例bean在實(shí)例化后都會(huì)被進(jìn)行提前曝光到三級(jí)緩存中	,      * 但是并不是所有的bean都存在循環(huán)依賴