欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring Bean的循環(huán)依賴解決方案

 更新時(shí)間:2018年01月29日 10:21:43   作者:盲枸  
這篇文章主要介紹了詳解Spring Bean的循環(huán)依賴解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

如果使用構(gòu)造函數(shù)注入,則可能會(huì)創(chuàng)建一個(gè)無(wú)法解析的循環(huán)依賴場(chǎng)景。

什么是循環(huán)依賴

循環(huán)依賴其實(shí)就是循環(huán)引用,也就是兩個(gè)或則兩個(gè)以上的bean互相持有對(duì)方,最終形成閉環(huán)。比如A依賴于B,B依賴于C,C又依賴于A。如下圖:

注意,這里不是函數(shù)的循環(huán)調(diào)用,是對(duì)象的相互依賴關(guān)系。循環(huán)調(diào)用其實(shí)就是一個(gè)死循環(huán),除非有終結(jié)條件。

Spring中循環(huán)依賴場(chǎng)景有:

(1)構(gòu)造器的循環(huán)依賴
(2)field屬性的循環(huán)依賴。

怎么檢測(cè)是否存在循環(huán)依賴

檢測(cè)循環(huán)依賴相對(duì)比較容易,Bean在創(chuàng)建的時(shí)候可以給該Bean打標(biāo),如果遞歸調(diào)用回來(lái)發(fā)現(xiàn)正在創(chuàng)建中的話,即說(shuō)明了循環(huán)依賴了。

下面是我所遇到的情況,代碼結(jié)構(gòu)如下:

SpringSecurity 配置類:

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
  private final UserDetailsService userDetailsService;

  /**
   * 通過(guò)配置類構(gòu)造函數(shù)注入 UserDetailsService
   */  
  @Autowired
  public BrowserSecurityConfig(UserDetailsService userDetailsService) {
    this.userDetailsService = userDetailsService;
  }

  /**
   * 在配置類中聲明 加密編碼器
   */
  @Bean
  public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }

  ... ...
}

UserDetailsService 類:

@Component
public class MyUserDetailService implements UserDetailsService {
  private final PasswordEncoder passwordEncoder;

  private Logger logger = LoggerFactory.getLogger(getClass());

  /**
   * 通過(guò)構(gòu)造函數(shù)注入 PasswordEncoder 
   */  
  @Autowired
  public MyUserDetailService(PasswordEncoder passwordEncoder) {
    this.passwordEncoder = passwordEncoder;
  }
  ... ...
}

運(yùn)行之后,Spring拋出了如下錯(cuò)誤信息:

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  browserSecurityConfig defined in file [D:\CODE\Java\IdeaProjects\mango-security\mango-security-browser\target\classes\stu\mango\security\browser\BrowserSecurityConfig.class]
↑     ↓
|  myUserDetailService defined in file [D:\CODE\Java\IdeaProjects\mango-security\mango-security-browser\target\classes\stu\mango\security\browser\MyUserDetailService.class]
└─────┘

該例中,BrowserSecurityConfig 通過(guò)構(gòu)造函數(shù)注入 UserDetailsService實(shí)例,而 UserDetailsService由通過(guò)構(gòu)造函數(shù)注入在BrowserSecurityConfig 中聲明的PasswordEncoder。

總結(jié)來(lái)說(shuō),Spring Bean的循環(huán)依賴是指,類A需要通過(guò)構(gòu)造函數(shù)注入的類B的實(shí)例(或者B中聲明的Bean),而類B需要通過(guò)構(gòu)造函數(shù)注入的類A的實(shí)例(或者A中聲明的Bean)。如果將類A和類B的bean配置為相互注入,則Spring IoC容器會(huì)在運(yùn)行時(shí)檢測(cè)到此循環(huán)引用,并引發(fā)一個(gè)BeanCurrentlyInCreationException。與典型情況(沒(méi)有循環(huán)依賴)不同,bean A和bean B之間的循環(huán)依賴關(guān)系迫使其中一個(gè)bean在被完全初始化之前被注入到另一個(gè)bean中(這是一個(gè)典型的“先有雞還是先有蛋”場(chǎng)景)。

解決方案

簡(jiǎn)明扼要的說(shuō),就是——不使用基于構(gòu)造函數(shù)的依賴注入??赏ㄟ^(guò)下面方式解決。

在字段上使用@Autowired注解,讓Spring決定在合適的時(shí)機(jī)注入?!就扑]】

基于setter方法的依賴注射取代基于構(gòu)造函數(shù)的依賴注入來(lái)解決循環(huán)依賴。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA“無(wú)法驗(yàn)證證書。將不執(zhí)行該應(yīng)用程序?!碧崾窘鉀Q辦法

    JAVA“無(wú)法驗(yàn)證證書。將不執(zhí)行該應(yīng)用程序?!碧崾窘鉀Q辦法

    這篇文章主要給大家介紹了關(guān)于JAVA“無(wú)法驗(yàn)證證書,將不執(zhí)行該應(yīng)用程序”提示的解決辦法,要解決Java無(wú)法驗(yàn)證證書的問(wèn)題,可以嘗試下本文的方法,需要的朋友可以參考下
    2024-03-03
  • spring boot2.0圖片上傳至本地或服務(wù)器并配置虛擬路徑的方法

    spring boot2.0圖片上傳至本地或服務(wù)器并配置虛擬路徑的方法

    最近寫了關(guān)于圖片上傳至本地文件夾或服務(wù)器,上傳路徑到數(shù)據(jù)庫(kù),并在上傳時(shí)預(yù)覽圖片。本文通過(guò)實(shí)例代碼給大家分享spring boot2.0圖片上傳至本地或服務(wù)器并配置虛擬路徑的方法,需要的朋友參考下
    2018-12-12
  • Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解

    Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解

    這篇文章主要介紹了Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java使用keySet方法獲取Map集合中的元素

    Java使用keySet方法獲取Map集合中的元素

    這篇文章主要為大家詳細(xì)介紹了Java使用keySet方法獲取Map集合中的元素,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作

    Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作

    Nebula?Graph?是一款開源的、分布式的、易擴(kuò)展的原生圖數(shù)據(jù)庫(kù),能夠承載包含數(shù)千億個(gè)點(diǎn)和數(shù)萬(wàn)億條邊的超大規(guī)模數(shù)據(jù)集,并且提供毫秒級(jí)查詢,這篇文章主要介紹了Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢,需要的朋友可以參考下
    2022-10-10
  • 詳談java線程與線程、進(jìn)程與進(jìn)程間通信

    詳談java線程與線程、進(jìn)程與進(jìn)程間通信

    下面小編就為大家?guī)?lái)一篇詳談java線程與線程、進(jìn)程與進(jìn)程間通信。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Springboot集成JSR303參數(shù)校驗(yàn)的方法實(shí)現(xiàn)

    Springboot集成JSR303參數(shù)校驗(yàn)的方法實(shí)現(xiàn)

    這篇文章主要介紹了Springboot集成JSR303參數(shù)校驗(yàn)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java?poi?讀取單元格null或者空字符串方式

    java?poi?讀取單元格null或者空字符串方式

    這篇文章主要介紹了java?poi?讀取單元格null或者空字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)

    插入排序的算法描述是一種簡(jiǎn)單直觀的排序算法。其原理是通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將用Java語(yǔ)言實(shí)現(xiàn)插入排序算法并進(jìn)行可視化,感興趣的可以了解一下
    2022-09-09
  • Java超詳細(xì)分析垃圾回收機(jī)制

    Java超詳細(xì)分析垃圾回收機(jī)制

    一個(gè)運(yùn)行中的程序,?產(chǎn)生的對(duì)象是大量的,?如果對(duì)象不被繼續(xù)使用,?就會(huì)成為垃圾,?最后越堆越多,?最后占滿內(nèi)存,?所以我們要對(duì)這些垃圾進(jìn)行回收,保持程序的正常運(yùn)行
    2022-05-05

最新評(píng)論