本文目錄
一、背景描述
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方法的依賴注入;以上方法僅供參考,一種方法不行可以多試幾種方法。當然最根本解決方案還是要知道自己的項目代碼爲什麼出錯,根據問題對症下藥纔是解決方案的王者。
完結!