自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入了解Spring的循環(huán)依賴解決策略

開發(fā) 前端
當(dāng)兩個(gè)或多個(gè)Bean相互依賴時(shí),Spring會(huì)使用三級(jí)緩存來(lái)確保每個(gè)Bean都能夠被正確地初始化,并且避免出現(xiàn)死鎖或無(wú)限循環(huán)等問(wèn)題。三級(jí)緩存機(jī)制允許Spring容器在創(chuàng)建Bean時(shí)暫時(shí)存儲(chǔ)正在創(chuàng)建的Bean實(shí)例,以便在循環(huán)依賴的情況下能夠正確地解析Bean的依賴關(guān)系,并最終完成Bean的初始化。

什么是spring循環(huán)依賴問(wèn)題?

在Spring框架中,循環(huán)依賴問(wèn)題指的是在依賴注入時(shí),由于Bean之間相互引用而導(dǎo)致的初始化問(wèn)題。

這種情況下,Spring容器在創(chuàng)建Bean的過(guò)程中,發(fā)現(xiàn)Bean A依賴于Bean B,而Bean B又依賴于Bean A,形成了循環(huán)依賴關(guān)系。

循環(huán)依賴的三種情況:

1.構(gòu)造器循環(huán)依賴:

當(dāng)兩個(gè)或多個(gè)Bean的構(gòu)造函數(shù)相互依賴時(shí),會(huì)形成構(gòu)造器循環(huán)依賴。這種情況下,Spring容器在創(chuàng)建Bean時(shí)無(wú)法確定哪個(gè)Bean應(yīng)該先被實(shí)例化,因?yàn)樗鼈兿嗷ヒ蕾囉诒舜说臉?gòu)造函數(shù)參數(shù)。

示例:

public class A {
  private B b;

  public A(B b) {
      this.b = b;
  }
}

public class B {
  private A a;

  public B(A a) {
      this.a = a;
  }
}

2.屬性循環(huán)依賴:

當(dāng)兩個(gè)或多個(gè)Bean的屬性相互依賴時(shí),會(huì)形成屬性循環(huán)依賴。例如,Bean A依賴于Bean B的屬性,而Bean B又依賴于Bean A的屬性,形成了屬性循環(huán)依賴。

示例:

public class A {
  private B b;

  public void setB(B b) {
      this.b = b;
  }
}

public class B {
  private A a;

  public void setA(A a) {
      this.a = a;
  }
}

3.單例Bean的循環(huán)依賴:

當(dāng)單例Bean之間相互依賴時(shí),會(huì)形成單例Bean的循環(huán)依賴。由于Spring默認(rèn)情況下會(huì)將單例Bean存儲(chǔ)在容器中,這種循環(huán)依賴問(wèn)題可能會(huì)導(dǎo)致死鎖或無(wú)限遞歸調(diào)用。

示例:

假設(shè)我們有兩個(gè)類 A 和 B,它們相互依賴:

public class A {
  private B b;

  public A() {
      // 無(wú)參構(gòu)造函數(shù)
  }

  public void setB(B b) {
      this.b = b;
  }
}

public class B {
  private A a;

  public B() {
      // 無(wú)參構(gòu)造函數(shù)
  }

  public void setA(A a) {
      this.a = a;
  }
}

假設(shè) A 類的一個(gè)實(shí)例需要依賴 B 類的一個(gè)實(shí)例,而 B 類的一個(gè)實(shí)例又需要依賴 A 類的一個(gè)實(shí)例,形成了循環(huán)依賴。在這種情況下,如果我們?cè)噲D使用 Spring 容器來(lái)管理這些類的實(shí)例,就會(huì)出現(xiàn)循環(huán)依賴的問(wèn)題。

例如,我們?cè)?Spring 的配置文件中定義了這兩個(gè)類的 Bean:

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

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

在初始化這些 Bean 時(shí),Spring 會(huì)發(fā)現(xiàn) A 類的實(shí)例需要 B 類的實(shí)例,而 B 類的實(shí)例又需要 A 類的實(shí)例,這樣就形成了循環(huán)依賴。如果不采取措施來(lái)解決這個(gè)問(wèn)題,Spring 容器就會(huì)陷入死循環(huán)或者拋出異常。

如何解決?

這三種循環(huán)依賴問(wèn)題在Spring中都有解決方案:

1.構(gòu)造器循環(huán)依賴解決方案:

可以通過(guò)使用@Lazy注解延遲初始化其中一個(gè)依賴,或者使用@Autowired與@Qualifier來(lái)指定構(gòu)造器參數(shù)的具體Bean。

示例代碼:

@Component
public class A {
  private B b;

  @Autowired
  public A(@Lazy B b) {
      this.b = b;
  }
}

@Component
public class B {
  private A a;

  @Autowired
  public B(A a) {
      this.a = a;
  }
}

2. 屬性循環(huán)依賴解決方案:

可以通過(guò)@Lazy注解延遲初始化其中一個(gè)依賴,或者將其中一個(gè)依賴設(shè)置為@Nullable,允許屬性為空。

示例代碼:

@Component
public class A {
  private B b;

  @Autowired
  public void setB(@Lazy B b) {
      this.b = b;
  }
}

@Component
public class B {
  private A a;

  @Autowired
  public void setA(A a) {
      this.a = a;
  }
}

3. 單例Bean的循環(huán)依賴解決方案:

可以通過(guò)使用@Lazy注解延遲初始化其中一個(gè)依賴,或者使用代理對(duì)象來(lái)解決單例Bean的循環(huán)依賴。

示例代碼:

<bean id="a" class="com.example.A" lazy-init="true">
  <property name="b" ref="b"/>
</bean>

<bean id="b" class="com.example.B" lazy-init="true">
  <property name="a">
      <bean class="org.springframework.beans.factory.config.BeanReferenceFactoryBean">
          <property name="beanName" value="a"/>
      </bean>
  </property>
</bean>

這些解決方案可以根據(jù)具體情況選擇適合的方式來(lái)解決Spring中的循環(huán)依賴問(wèn)題。

什么是三級(jí)緩存?

在Spring框架中,三級(jí)緩存是用來(lái)解決循環(huán)依賴問(wèn)題的一種機(jī)制。它由Spring容器中的三個(gè)緩存組成,用于臨時(shí)存儲(chǔ)正在創(chuàng)建的Bean實(shí)例。這三個(gè)緩存分別是singletonObjects、earlySingletonObjects和singletonFactories。

  1. singletonObjects:這是最終的單例緩存,用于存儲(chǔ)完全初始化的Bean實(shí)例。當(dāng)Bean的所有依賴已經(jīng)注入并且初始化完成后,Bean將被放入singletonObjects緩存中。
  2. earlySingletonObjects:這是早期的單例緩存,用于存儲(chǔ)尚未完全初始化的Bean實(shí)例。當(dāng)Bean正在創(chuàng)建但尚未完成初始化時(shí),Bean將暫時(shí)存儲(chǔ)在earlySingletonObjects緩存中。
  3. singletonFactories:這是存儲(chǔ)用于創(chuàng)建Bean實(shí)例的ObjectFactory的緩存。當(dāng)創(chuàng)建Bean實(shí)例時(shí),會(huì)使用ObjectFactory來(lái)延遲創(chuàng)建Bean,將ObjectFactory存儲(chǔ)在singletonFactories緩存中。

三級(jí)緩存的作用?

三級(jí)緩存的作用是解決Spring中的循環(huán)依賴問(wèn)題。

當(dāng)兩個(gè)或多個(gè)Bean相互依賴時(shí),Spring會(huì)使用三級(jí)緩存來(lái)確保每個(gè)Bean都能夠被正確地初始化,并且避免出現(xiàn)死鎖或無(wú)限循環(huán)等問(wèn)題。三級(jí)緩存機(jī)制允許Spring容器在創(chuàng)建Bean時(shí)暫時(shí)存儲(chǔ)正在創(chuàng)建的Bean實(shí)例,以便在循環(huán)依賴的情況下能夠正確地解析Bean的依賴關(guān)系,并最終完成Bean的初始化。

責(zé)任編輯:武曉燕 來(lái)源: 架構(gòu)殿堂
相關(guān)推薦

2017-01-20 08:30:19

JavaScriptfor循環(huán)

2019-11-29 16:21:22

Spring框架集成

2019-03-05 10:52:13

2024-07-01 00:00:04

ViteUMD瀏覽器

2020-07-20 06:35:55

BashLinux

2010-11-19 16:22:14

Oracle事務(wù)

2010-07-13 09:36:25

2010-06-23 20:31:54

2009-08-25 16:27:10

Mscomm控件

2022-08-26 13:48:40

EPUBLinux

2020-09-21 09:53:04

FlexCSS開發(fā)

2018-02-24 13:21:02

2013-04-10 11:16:19

iPad的MouseE

2016-10-20 08:46:17

2018-09-04 16:20:46

MySQ索引數(shù)據(jù)結(jié)構(gòu)

2021-09-03 08:27:47

FortinetSASE平臺(tái)安全

2019-08-02 08:59:21

Token認(rèn)證服務(wù)器

2013-04-16 10:20:21

云存儲(chǔ)服務(wù)云存儲(chǔ)SLA服務(wù)水平協(xié)議

2021-04-28 10:13:58

zookeeperZNode核心原理

2021-01-19 12:00:39

前端監(jiān)控代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)