Java異常之----The dependencies of some of the beans in the application context form a cycle

本文目錄

一、背景描述

二、問題原因

三、解決方案

3.1 方案1

3.2 方案2

 四、其他解決方案


一、背景描述

Springboot 2.1.5  + MybatisPlus 3.3.1

今天啓動一個springboot項目時,竟然發現項目啓動失敗,提示信息如下:

Description:

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

   configDataFeignController (field private com.iot.basic.config.business.service.ConfigDataService com.iot.basic.config.controller.feign.configdata.ConfigDataFeignController.configDataService)
┌─────┐
|  configDataService defined in file [G:\smarthome\2項目代碼\trunk\雲端\basic-iot-config(基礎配置服務)\basic-iot-config\iot-config-business\target\classes\com\iot\basic\config\business\service\impl\ConfigDataServiceImpl.class]
↑     ↓
|  productConfigDataContentService defined in file [G:\smarthome\2項目代碼\trunk\雲端\basic-iot-config(基礎配置服務)\basic-iot-config\iot-config-business\target\classes\com\iot\basic\config\business\service\impl\ProductConfigDataContentServiceImpl.class]
└─────┘

仔細檢查了這兩個類,發現Bean的注入方式均爲@AllArgsConstructor使用了基於構造器依賴注入的方式。下面就是項目中的代碼截圖:兩個Java類中都是這樣的寫法

二、問題原因

問題產生的原因是 ServiceA實現類中引入了ServiceB,而在ServiceB實現類中又引入了ServiceA,導致循環依賴注入。

其實在代碼開發過程中應該儘量避免這種操作的出現,即使再複雜的業務場景也不應該有這波操作。

知道以上原因了,那麼就可以對症下藥了。

三、解決方案

網上方案很多,網上的方式都是針對項目實際存在的問題的解決方案,不一定適合自己的項目,如果不懂,只有多試幾種方法,總有一種適合自己的項目。

3.1 方案1

在ServiceA實現類中引入ServiceB,而ServiceB再引入ServiceC,避免循環依賴。在實際中應該使用這種方式,我比較懶,使用了方案2,本地測試使用。

3.2 方案2

比較懶的一種方式是,使用Spring@Autowired自動依賴注入方式成功解決這個問題。

 四、其他解決方案

順帶在網上也找了下別人的解決辦法,總結起來有以下幾種:

1、在字段上使用@Autowired註解,讓Spring決定在合適的時機注入;
2、不要使用基於構造函數的依賴注入;
3、用基於setter方法的依賴注入;

以上方法僅供參考,一種方法不行可以多試幾種方法。當然最根本解決方案還是要知道自己的項目代碼爲什麼出錯,根據問題對症下藥纔是解決方案的王者。

 

 

 

完結!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章