一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - 詳解Spring Bean的循環依賴解決方案

詳解Spring Bean的循環依賴解決方案

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

這篇文章主要介紹了詳解Spring Bean的循環依賴解決方案,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

如果使用構造函數注入,則可能會創建一個無法解析的循環依賴場景。

什么是循環依賴

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

詳解Spring Bean的循環依賴解決方案

注意,這里不是函數的循環調用,是對象的相互依賴關系。循環調用其實就是一個死循環,除非有終結條件。

Spring中循環依賴場景有:

(1)構造器的循環依賴
(2)field屬性的循環依賴。

怎么檢測是否存在循環依賴

檢測循環依賴相對比較容易,Bean在創建的時候可以給該Bean打標,如果遞歸調用回來發現正在創建中的話,即說明了循環依賴了。

下面是我所遇到的情況,代碼結構如下:

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;
 
  /**
   * 通過配置類構造函數注入 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());
 
  /**
   * 通過構造函數注入 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 通過構造函數注入 UserDetailsService實例,而 UserDetailsService由通過構造函數注入在BrowserSecurityConfig 中聲明的PasswordEncoder。

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

解決方案

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

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

基于setter方法的依賴注射取代基于構造函數的依賴注入來解決循環依賴。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产专区亚洲欧美另类在线 | 免费高清视频在线观看 | 视频免费视频观看网站 | 免费特黄一区二区三区视频一 | 国产成年人 | 国产免费好大好硬视频 | 美女在尿口隐私视频 | 国产精品久久国产精品99盘 | 国产亚洲精品福利在线 | 亚久久伊人精品青青草原2020 | 四虎成人影院 | 风间由美m3u8在线 | 四虎影视免费观看免费观看 | 日本视频一区在线观看免费 | 亚洲欧美日韩中文字幕久久 | 91麻豆精品国产自产在线观看 | jux539原千岁在线播放 | 日韩一级在线观看 | 激情六月丁香婷婷四房播 | 双性人bbww欧美双性 | 男女全黄h全肉细节文 | 2015小明台湾永久区域免费 | 免费在线观看网址大全 | 5g影院天天5g天天爽大陆 | 荡女人人爱全文免费阅读 | 亚洲精品一区二区三区在线看 | 久久无码人妻AV精品一区 | 女子监狱第二季未删减在线看 | 久久精品一区 | 青青热久麻豆精品视频在线观看 | 精品一区二区视频 | 99视频免费在线观看 | 亚洲高清毛片一区二区 | 亚洲第一福利网 | 国产一区二区三区高清视频 | 青青国产精品 | 俄罗斯毛片免费大全 | 人人最怕九月羊 | 精品视频网站 | 欧美最猛性xxxxx短视频 | caoporm国产精品视频免费 |