国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring bean的三級(jí)緩存原理

這篇具有很好參考價(jià)值的文章主要介紹了spring bean的三級(jí)緩存原理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

當(dāng)我們?cè)谑褂?Spring 框架時(shí),通常會(huì)遇到循環(huán)依賴、AOP 代理等問題。為了解決這些問題,Spring 引入了三級(jí)緩存機(jī)制,
即 singletonObjects、earlySingletonObjects 和 singletonFactories 三個(gè)緩存。本文將詳細(xì)介紹 Spring 三級(jí)緩存的原理和作用。

1. Spring 三級(jí)緩存的作用

在 Spring 框架中,Bean 實(shí)例化和依賴注入是非常重要的步驟。在這個(gè)過程中,循環(huán)依賴和 AOP 代理是兩個(gè)比較常見的問題,而三級(jí)緩存機(jī)制就是為了解決這些問題而設(shè)計(jì)的。
具體來說,Spring 的三級(jí)緩存的作用如下:

解決循環(huán)依賴問題:當(dāng)一個(gè) Bean 的創(chuàng)建依賴于其他 Bean 的創(chuàng)建時(shí),就可能會(huì)出現(xiàn)循環(huán)依賴的問題。Spring 的三級(jí)緩存機(jī)制可以通過代理對(duì)象的方式來解決循環(huán)依賴問題。

確保單例模式:Spring 默認(rèn)使用單例模式來管理 Bean,即同一個(gè) Bean 在應(yīng)用程序的整個(gè)生命周期中只被創(chuàng)建一次。而三級(jí)緩存機(jī)制可以確保單例模式的正確實(shí)現(xiàn)。

提高 Spring 的性能:使用緩存可以提高 Spring 的性能,因?yàn)榫彺婵梢员苊庵貜?fù)創(chuàng)建 Bean 實(shí)例的開銷。

解決 AOP 代理對(duì)象和目標(biāo)對(duì)象名稱沖突問題:在使用 AOP 的時(shí)候,如果將目標(biāo)對(duì)象和代理對(duì)象都緩存在 singletonObjects 緩存中,就可能會(huì)出現(xiàn)兩個(gè)對(duì)象名稱相同的問題,這可能會(huì)導(dǎo)致一些奇怪的問題出現(xiàn),比如說無法注入正確的對(duì)象。因此,Spring 引入了 singletonFactories 緩存來解決這個(gè)問題。

2. Spring 三級(jí)緩存的實(shí)現(xiàn)原理

在 Spring 中,Bean 的創(chuàng)建過程可以分為以下幾個(gè)階段:
解析 BeanDefinition:讀取配置文件或者注解等方式,將 BeanDefinition 解析成對(duì)象。
創(chuàng)建 Bean 實(shí)例:根據(jù) BeanDefinition 中的信息,創(chuàng)建 Bean 實(shí)例,并進(jìn)行屬性注入和初始化等操作。
將 Bean 實(shí)例放入緩存:將創(chuàng)建好的 Bean 實(shí)例放入 Spring 的緩存中,以供后續(xù)使用。
在這個(gè)過程中,Spring 的三級(jí)緩存機(jī)制就發(fā)揮了重要的作用。下面我們來分別介紹三級(jí)緩存的作用和實(shí)現(xiàn)原理。
2.1 singletonObjects 緩存
singletonObjects 緩存是 Spring 中最常用的一個(gè)緩存,用于存儲(chǔ)已經(jīng)創(chuàng)建好的 Bean 實(shí)例。這個(gè)緩存是一個(gè) ConcurrentHashMap 類型的對(duì)象,它將 Bean 的名稱作為 key,將 Bean 實(shí)例作為 value。
在使用 singletonObjects 緩存時(shí)
,在使用 singletonObjects 緩存時(shí),Spring 首先會(huì)從緩存中嘗試獲取 Bean 實(shí)例。如果緩存中不存在對(duì)應(yīng)的 Bean 實(shí)例,那么就會(huì)繼續(xù)執(zhí)行創(chuàng)建 Bean 實(shí)例的操作。在創(chuàng)建 Bean 實(shí)例的過程中,如果發(fā)現(xiàn)當(dāng)前 Bean 已經(jīng)被創(chuàng)建了,則會(huì)從 singletonObjects 緩存中獲取該 Bean 實(shí)例并返回。
在默認(rèn)情況下,singletonObjects 緩存的存儲(chǔ)策略是“早期曝光”。也就是說,當(dāng) Bean 實(shí)例被創(chuàng)建后,就會(huì)被立即放入 singletonObjects 緩存中。這樣可以確保在創(chuàng)建 Bean 實(shí)例時(shí)就能夠獲取到該實(shí)例的引用,避免了出現(xiàn)循環(huán)依賴問題。
2.2 earlySingletonObjects 緩存
earlySingletonObjects 緩存是 Spring 中比較少用到的一個(gè)緩存。它的作用是存儲(chǔ)“早期曝光”的 Bean 實(shí)例,也就是在創(chuàng)建 Bean 實(shí)例時(shí)尚未完成依賴注入的 Bean 實(shí)例。
在創(chuàng)建 Bean 實(shí)例的過程中,如果發(fā)現(xiàn)該 Bean 依賴于另外一個(gè)還未創(chuàng)建完成的 Bean,那么就會(huì)將當(dāng)前 Bean 實(shí)例放入 earlySingletonObjects 緩存中。等到該依賴的 Bean 實(shí)例創(chuàng)建完成后,Spring 就會(huì)將 earlySingletonObjects 緩存中的 Bean 實(shí)例進(jìn)行依賴注入,并將其移動(dòng)到 singletonObjects 緩存中。
2.3 singletonFactories 緩存
singletonFactories 緩存是 Spring 中專門為解決 AOP 代理對(duì)象和目標(biāo)對(duì)象名稱沖突問題而設(shè)計(jì)的緩存。在使用 AOP 的時(shí)候,如果將目標(biāo)對(duì)象和代理對(duì)象都緩存在 singletonObjects 緩存中,就可能會(huì)出現(xiàn)兩個(gè)對(duì)象名稱相同的問題,這可能會(huì)導(dǎo)致一些奇怪的問題出現(xiàn),比如說無法注入正確的對(duì)象。
為了解決這個(gè)問題,Spring 引入了 singletonFactories 緩存。在創(chuàng)建代理對(duì)象時(shí),Spring 首先會(huì)創(chuàng)建一個(gè) ObjectFactory 對(duì)象,并將其放入 singletonFactories 緩存中。等到需要使用代理對(duì)象時(shí),Spring 就會(huì)調(diào)用 ObjectFactory 的 getObject() 方法來創(chuàng)建代理對(duì)象,并將其放入 singletonObjects 緩存中。

3. 三級(jí)緩存的使用示例

為了更好地理解 Spring 的三級(jí)緩存機(jī)制,下面我們來看一個(gè)簡(jiǎn)單的示例。
假設(shè)我們有一個(gè)名為 User 的 Bean,它依賴于另一個(gè)名為 Role 的 Bean。此時(shí),Spring 的 Bean 創(chuàng)建過程可以分為以下幾個(gè)階段:
解析 User 和 Role 的 BeanDefinition,將其解析為對(duì)象。
創(chuàng)建 Role Bean 實(shí)例,并放入 singletonObjects 緩存中。
創(chuàng)建 User Bean 實(shí)例,發(fā)現(xiàn)它依賴于 Role Bean,將 User 實(shí)例放入 earlySingletonObjects 緩存中。
創(chuàng)建 Role Bean 實(shí)例的代理對(duì)象,并將代理對(duì)象
放入 singletonObjects 緩存中。
將 Role Bean 實(shí)例注入到 User Bean 實(shí)例中。
將 User 實(shí)例從 earlySingletonObjects 緩存中移動(dòng)到 singletonObjects 緩存中。
在這個(gè)過程中,三級(jí)緩存的作用可以概括為:
singletonObjects 緩存用于存儲(chǔ)創(chuàng)建完成并已經(jīng)進(jìn)行了依賴注入的 Bean 實(shí)例。
earlySingletonObjects 緩存用于存儲(chǔ)已經(jīng)創(chuàng)建但尚未進(jìn)行依賴注入的 Bean 實(shí)例。
singletonFactories 緩存用于存儲(chǔ) AOP 代理對(duì)象和目標(biāo)對(duì)象名稱相同時(shí)的代理工廠對(duì)象。
三級(jí)緩存的使用示例代碼如下:

@Component
public class User {
 
    @Autowired
    private Role role;



    // 省略其他代碼
}
}



@Component
public class Role {



    // 省略其他代碼
}
}



@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {



    @Bean
    public Role role() {
 
        return new Role();
 
    }



    @Bean
    public User user() {
 
        return new User();
 
    }



    @Bean
    public RoleInterceptor roleInterceptor() {
 
        return new RoleInterceptor();
 
    }



    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
 
        return new DefaultAdvisorAutoProxyCreator();
 
    }



    @Bean
    public ProxyFactoryBean roleProxy() {
 
        ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
 
        proxyFactoryBean.setTarget(role());
 
        proxyFactoryBean.addAdvice(roleInterceptor());
 
        return proxyFactoryBean;
 
    }
}
}



public class RoleInterceptor implements MethodInterceptor {
 
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
 
        System.out.println("before");
 
        Object result = invocation.proceed();
 
        System.out.println("after");
 
        return result;
 
    }
}
}



public class Main {
 
    public static void main(String[] args) {
 
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
 
        User user = context.getBean(User.class);
 
    }
}
}

在上面的代碼中,我們創(chuàng)建了一個(gè) User Bean,它依賴于 Role Bean。我們還創(chuàng)建了一個(gè) RoleInterceptor 來作為 Role Bean 的 AOP 攔截器,以及一個(gè) Role Bean 的代理對(duì)象。
在這個(gè)例子中,如果我們將三級(jí)緩存的某一級(jí)去掉,就可能會(huì)導(dǎo)致 Bean 創(chuàng)建失敗或者出現(xiàn)一些奇怪的問題,比如說:
如果沒有 earlySingletonObjects 緩存,就可能會(huì)出現(xiàn)循環(huán)依賴問題,導(dǎo)致 Bean 創(chuàng)建失敗。
如果沒有 singletonFactories 緩存,就可能會(huì)出現(xiàn)兩個(gè)對(duì)象名稱相同的問題,導(dǎo)致注入錯(cuò)誤的對(duì)象或者無法注入對(duì)象。
因此,Spring 的三級(jí)緩存機(jī)制可以很好地保證 Bean 的創(chuàng)建和依賴注入的正確性,同時(shí)也能夠有效地避免一些奇怪的問題出現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-440206.html

到了這里,關(guān)于spring bean的三級(jí)緩存原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring 三級(jí)緩存

    一級(jí)緩存 SingletonObject 存放完全初始化好的bean,該緩存取出來的bean 可以直接使用 二級(jí)緩存 earlySingletonObject 提前曝光單單例對(duì)象的cache,存放原始對(duì)象bean(尚未填充屬性),用于解決循環(huán)依賴。 三級(jí)緩存 SingletonFacotoies單例對(duì)象工廠的cache,存放 ObjectFactory對(duì)象,用于解決循環(huán)依賴。

    2024年02月08日
    瀏覽(19)
  • Spring三級(jí)緩存詳解

    Spring三級(jí)緩存 是為了解決 對(duì)象間的循環(huán)依賴 問題。 A依賴B,B依賴A,這就是一個(gè)簡(jiǎn)單的循環(huán)依賴。 我們來先看看三級(jí)緩存的源碼。 (1)查看“獲取Bean”的源碼,注意getSingleton()方法。 (2)“添加到第1級(jí)緩存”的源碼: (3)“添加到第3級(jí)緩存”的源碼: (4)“創(chuàng)建Be

    2024年02月07日
    瀏覽(29)
  • 【Spring】三級(jí)緩存

    【Spring】三級(jí)緩存

    結(jié)合文章:循環(huán)依賴 測(cè)試代碼如下: 執(zhí)行refresh 方法 執(zhí)行finishBeanFactoryInitialization 方法 執(zhí)行preInstantiateSingletons 方法 實(shí)際上就是通過 doGetBean ,先進(jìn)行 bean-a 的初始化 去緩存查看時(shí)候有 bean - a 實(shí)際上就是通過雙重校驗(yàn)鎖,去查看一級(jí)緩存中是否有 bean-a 并且沒有在創(chuàng)建中 ,所

    2024年02月21日
    瀏覽(15)
  • 三級(jí)緩存---解決 Spring 循環(huán)依賴

    三級(jí)緩存---解決 Spring 循環(huán)依賴

    首先,什么是循環(huán)依賴?這個(gè)其實(shí)好理解,就是兩個(gè) Bean 互相依賴,類似下面這樣: \\\"\\\"\\\" \\\"\\\"\\\" AService 和 BService 互相依賴: 一般來說,循環(huán)依賴有三種不同的形態(tài),上面就是其中一種。 另外兩種分別是三者依賴,如下圖: 這種循環(huán)依賴一般隱藏比較深,不易發(fā)覺。 還有自我依

    2024年02月16日
    瀏覽(23)
  • spring解決循環(huán)依賴的三級(jí)緩存

    實(shí)例化,對(duì)應(yīng)方法:AbstractAutowireCapableBeanFactory中的createBeanInstance方法,簡(jiǎn)單理解就是new了一個(gè)對(duì)象。 屬性注入,對(duì)應(yīng)方法:AbstractAutowireCapableBeanFactory的populateBean方法,為實(shí)例化中new出來的對(duì)象填充屬性和注入依賴。 初始化,對(duì)應(yīng)方法:AbstractAutowireCapableBeanFactory的initialize

    2024年02月03日
    瀏覽(24)
  • Spring——三級(jí)緩存解決循環(huán)依賴詳解

    Spring——三級(jí)緩存解決循環(huán)依賴詳解

    就是在Bean生成流程中保存Bean對(duì)象三種形態(tài)的三個(gè)Map集合,如下: 用來解決什么問題? 這個(gè)大家應(yīng)該熟知了,就是循環(huán)依賴 什么是循環(huán)依賴? 就像下面這樣,AService 中注入了BService ,而BService 中又注入了AService ,這就是循環(huán)依賴 這幾個(gè)問題我們結(jié)合源碼來一起看一下 : 三級(jí)

    2024年02月03日
    瀏覽(41)
  • [Spring] 三級(jí)緩存解決循環(huán)依賴詳解

    [Spring] 三級(jí)緩存解決循環(huán)依賴詳解

    注冊(cè)一個(gè)bean對(duì)象的過程: Spring掃描class得到BeanDefinition – 根據(jù)得到的BeanDefinition去生成bean – 現(xiàn)根據(jù)class推斷構(gòu)造方法 – 根據(jù)推斷出來的構(gòu)造方法,反射,得到一個(gè)對(duì)象 – 填充初始對(duì)象中的屬性(依賴注入) – 如果原始對(duì)象種的某個(gè)方法被AOP了,那么要根據(jù)原始對(duì)象生成一

    2024年02月15日
    瀏覽(22)
  • 【Spring框架全系列】方法注解@Bean的使用

    【Spring框架全系列】方法注解@Bean的使用

    ????哈嘍,大家好,我是小浪。上篇博客我們介紹了五大類注解的使用方法,以及如何解決Spring使用五大類注解生成bean-Name的問題;那么,談到如何更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象,這里我們還需要介紹另外一個(gè)\\\"方法注解@Bean\\\"的使用,快來一起學(xué)習(xí)叭!???? ??目錄 一、如何使

    2024年02月04日
    瀏覽(23)
  • spring 的循環(huán)依賴以及spring為什么要用三級(jí)緩存解決循環(huán)依賴

    spring 的循環(huán)依賴以及spring為什么要用三級(jí)緩存解決循環(huán)依賴

    ??????? bean的生命周期 ??????? 這里簡(jiǎn)單過一下 class -無參構(gòu)造 -普通對(duì)象 -依賴注入(對(duì)加了autowire等的屬性賦值) -初始化前-初始化 -初始化后(aop) -放入單例池的map(一級(jí)緩存) -bean對(duì)象 這里提一點(diǎn)單例bean單例bean 其實(shí)就是用mapbeanName,Bean對(duì)象創(chuàng)建的,多例bean就不

    2024年02月15日
    瀏覽(24)
  • Spring 為什么要用三級(jí)緩存來解決循環(huán)依賴(AOP),二級(jí)緩存不行嗎

    解決有代理對(duì)象的循環(huán)依賴不一定要三級(jí)緩存,用二級(jí)甚至一級(jí)也能解決,下面討論下Spring為什么選擇三級(jí)緩存這個(gè)方案。 Spring最開始是沒有三級(jí)緩存的,后面版本因?yàn)橐肓薃OP,有了代理對(duì)象,又因?yàn)榇嬖谘h(huán)依賴,為了保證依賴注入過程注入的是代理對(duì)象,且不完全打破

    2024年04月26日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包