spring-ioc 之循環依賴

1,什麼是spring-iocjava

       其實spring-ioc並非一個概念,能夠拆分爲兩個,一個是spring,一個是ioc,spring是一個java比較強大的開源框架,而spring-ioc只是這個框架核心功能一部分,這個搞java的都知道吧,那麼ioc呢就是《控制反轉》這裏也不便多說,因此spring-ioc就是一個提供控制反轉功能的框架。spring

2,什麼是循環依賴緩存

    舉個例子,a依賴於b,且b依賴於a,用xml文件表示就是框架

<bean name="a" class="com.chameleon.A">
   <property name="b" ref="b"/>
</bean>

<bean name="b" class="com.chameleon.B">
   <property name="a" ref="a"/>
</bean>

    可能你們會說,這沒什麼呢,注入進去就行了,可是若是研究過死鎖的話可能就會發現一個問題,那就是在建立A 注入B的時候,接下來建立B注入A的話是否是會產生「死鎖」呢?有可能的。xml

3,spring中依賴注入的種類對象

    按照注入形式區分的話,spring中依賴注入的種類大致能夠分爲三類內存

  • 構造方法注入:在構造方法參數中注入依賴類。
  • 多實例非構造方法注入:經過類變量注入,而且注入的對象是多實例的。
  • 單實例非構造方式注入:經過類變量注入,而且注入的對象是單實例的

    在spring-ioc的實現中,前兩種是沒有辦法解決依賴注入的,可是第三種能夠解決,接下來會分析解決辦法。io

4,spring如何解決循環依賴class

    spring依賴注入會通過兩個步驟完成變量

    (1)建立本實例對象:建立當前的bean實例對象

    (2)依賴注入:建立當前對象的依賴的對象實例,並注入到當前對象中

    單實例的話,spring會在第一步將這個「半成品」對象放到緩存中,那麼若是須要再次使用的話就能夠在這個緩存中獲取這個半成品的對象,而不須要重複的建立,同時也解決了循環依賴的問題

    那麼如今看一下爲何構造方法注入和多實例非構造方法注入不能夠?首先構造方法注入這種形式在依賴注入的時候是沒有「建立本實例對象」這一步的因此也沒法緩存「半成品對象",而多實例非構造方法注入這種形式的每個對象都是新的對象,若是出現循環依賴的話,那出現的結果就是建立無限多的對象,最終致使內存爆炸了。

相關文章
相關標籤/搜索