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

詳解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?熱更新?Groovy?實(shí)踐及踩坑指南(推薦)

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

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

    通過(guò)Java組合問(wèn)題看透回溯法

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

    springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪問(wèn)404問(wèn)題

    這篇文章主要介紹了springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪問(wèn)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java 無(wú)符號(hào)右移與右移運(yùn)算符的使用介紹

    Java 無(wú)符號(hào)右移與右移運(yùn)算符的使用介紹

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

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

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

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

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

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

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

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

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

    MyBatis-Plus自動(dòng)填充功能失效導(dǎo)致的原因及解決

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

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

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

最新評(píng)論

大安市| 湘潭县| 庆安县| 扶风县| 团风县| 谷城县| 榆中县| 蛟河市| 成安县| 锦屏县| 交口县| 临漳县| 望谟县| 汉寿县| 柳林县| 叶城县| 平顶山市| 新余市| 南乐县| 乳山市| 武乡县| 宣汉县| 庐江县| 兴义市| 蚌埠市| 称多县| 密山市| 东源县| 宣武区| 田阳县| 拜泉县| 全椒县| 遂溪县| 紫阳县| 莱阳市| 洛宁县| 城固县| 丰镇市| 肥西县| 太仓市| 万载县|