激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 詳解Spring Bean的循環(huán)依賴解決方案

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

2021-03-28 13:48盲枸 Java教程

這篇文章主要介紹了詳解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。如下圖:

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

注意,這里不是函數(shù)的循環(huán)調(diào)用,是對象的相互依賴關(guān)系。循環(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打標(biāo),如果遞歸調(diào)用回來發(fā)現(xiàn)正在創(chuàng)建中的話,即說明了循環(huán)依賴了。

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

SpringSecurity 配置類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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 類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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)依賴關(guān)系迫使其中一個bean在被完全初始化之前被注入到另一個bean中(這是一個典型的“先有雞還是先有蛋”場景)。

解決方案

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

在字段上使用@Autowired注解,讓Spring決定在合適的時機注入。【推薦】

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jianshu.com/p/d935341694d2

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区免费在线 | 国产在线观看 | 国产精品一区二区三区在线播放 | 久久国产经典 | 91,视频免费看 | 国产欧美日韩久久久 | 欧美成人一区二区三区电影 | 草莓福利社区在线 | 日本特级a一片免费观看 | chinese军人gay呻吟 | 久久网国产精品 | 99精品视频一区二区 | av在线观 | 成人国产精品一区 | 欧日一级片 | 中日韩乱码一二新区 | 欧美在线观看黄色 | 97中文字幕第一一一页 | 国产精品一区二区三区在线看 | 欧美色淫 | 免费毛片免费看 | 欧美日韩精品一区二区三区蜜桃 | 欧美国产91| 在线看一区二区三区 | 全免费午夜一级毛片真人 | 久久国产乱子伦精品 | 美国人成人在线视频 | 日本在线不卡免费 | 国产精品视频一区二区三区四区五区 | 国产亚洲精品久久久闺蜜 | 最新一级毛片 | 成人男女免费视频 | 精品人伦一区二区三区蜜桃网站 | 美女视频网站黄色 | 国产精品午夜未成人免费观看 | 羞羞漫画无遮挡观看 | www.17c亚洲蜜桃 | 黄色高清视频网站 | 久久久久久久久国产精品 | 91九色蝌蚪国产 | 午夜a狂野欧美一区二区 |