最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

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

SpringSecurity 配置類:

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

  /**
   * 通過配置類構(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());

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

運行之后,Spring拋出了如下錯誤信息:

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 通過構(gòu)造函數(shù)注入 UserDetailsService實例,而 UserDetailsService由通過構(gòu)造函數(shù)注入在BrowserSecurityConfig 中聲明的PasswordEncoder。

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

解決方案

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java?熱更新?Groovy?實踐及踩坑指南(推薦)

    Java?熱更新?Groovy?實踐及踩坑指南(推薦)

    Apache的Groovy是Java平臺上設計的面向?qū)ο缶幊陶Z言,這門動態(tài)語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺的腳本語言使用,這篇文章主要介紹了Java?熱更新?Groovy?實踐及踩坑指南,需要的朋友可以參考下
    2022-09-09
  • 通過Java組合問題看透回溯法

    通過Java組合問題看透回溯法

    今天給大家分享一道LeetCode算法題,題目不是很困難,但是從這到簡單的題目我們可以分析出回溯算法的幾個核心要點,感興趣的可以了解一下
    2022-09-09
  • springmvc Controller方法沒有加@ResponseBody導致api訪問404問題

    springmvc Controller方法沒有加@ResponseBody導致api訪問404問題

    這篇文章主要介紹了springmvc Controller方法沒有加@ResponseBody導致api訪問404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java 無符號右移與右移運算符的使用介紹

    Java 無符號右移與右移運算符的使用介紹

    這篇文章主要介紹了Java 無符號右移與右移運算符的使用介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • java地理坐標系及投影間轉(zhuǎn)換代碼示例

    java地理坐標系及投影間轉(zhuǎn)換代碼示例

    在地圖投影中,經(jīng)常需要將坐標從不同的坐標系之間進行轉(zhuǎn)換,下面這篇文章主要給大家介紹了關于java地理坐標系及投影間轉(zhuǎn)換的相關資料,需要的朋友可以參考下
    2024-08-08
  • JDK17安裝教程以及其環(huán)境變量配置教程

    JDK17安裝教程以及其環(huán)境變量配置教程

    環(huán)境變量對Java初學者來說真的是一件頭疼的事,本人也經(jīng)歷過這樣的事情,這篇文章主要給大家介紹了關于JDK17安裝教程以及其環(huán)境變量配置的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Spring Boot項目中實現(xiàn)文件上傳功能的示例

    Spring Boot項目中實現(xiàn)文件上傳功能的示例

    這篇文章主要介紹了Spring Boot項目中實現(xiàn)文件上傳功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java使用freemarker實現(xiàn)word下載方式

    Java使用freemarker實現(xiàn)word下載方式

    文章介紹了如何使用FreeMarker實現(xiàn)Word文件下載,包括引用依賴、創(chuàng)建Word模板、將Word文件存為XML格式、更改后綴為FTL模板、處理圖片和代碼實現(xiàn)
    2025-02-02
  • MyBatis-Plus自動填充功能失效導致的原因及解決

    MyBatis-Plus自動填充功能失效導致的原因及解決

    這篇文章主要介紹了MyBatis-Plus自動填充功能失效導致的原因及解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • spring?boot?executable?jar/war?原理解析

    spring?boot?executable?jar/war?原理解析

    spring boot里其實不僅可以直接以 java -jar demo.jar的方式啟動,還可以把jar/war變?yōu)橐粋€可以執(zhí)行的腳本來啟動,比如./demo.jar,這篇文章主要介紹了spring?boot?executable?jar/war?原理,需要的朋友可以參考下
    2023-02-02

最新評論

唐山市| 崇左市| 湖口县| 江陵县| 南和县| 陵川县| 漳州市| 什邡市| 仪陇县| 安仁县| 竹溪县| 新建县| 富川| 邮箱| 琼结县| 若尔盖县| 湛江市| 漠河县| 繁昌县| 玉环县| 岳普湖县| 青龙| 万年县| 毕节市| 富锦市| 大理市| 芦山县| 拜城县| 英吉沙县| 永康市| 舞阳县| 汕头市| 耿马| 阿拉善盟| 波密县| 前郭尔| 静乐县| 土默特右旗| 喀喇| 静海县| 巨鹿县|