SpringBoot3.x循環(huán)依賴問題解決方案
問題說明
SpringBoot3.x
版本已經(jīng)發(fā)布,從SpringBoot2.6.x
后就做了很多的改變。
用過SpringBoot2.7.5~x
版本的伙伴應該會發(fā)現(xiàn),SpringBoot
項目中如果存在循環(huán)依賴關系,則在啟動項目的時候會出現(xiàn)異常錯誤信息,提示內(nèi)容大致為:項目中存在循環(huán)依賴,項目無法正常啟動運行。
自SpringBoot2.7.5~x
版本以后至SpringBoot3.x
都存在這個問題,Spring
已經(jīng)摒棄循環(huán)依賴的問題,需要開發(fā)人員自行解決,或在開發(fā)過程中盡量避免循環(huán)依賴的出現(xiàn)。
對于舊版本項目升級的來說,這將會是一件很棘手的問題,所有的存在循環(huán)依賴關系的代碼都需要重新調(diào)整,況且一不小心就會代碼崩潰無法運行。
解決方案
第一種、開啟循環(huán)依賴(不推薦)
Spring默認已經(jīng)不在支持循環(huán)依賴,在配置文件中重新開啟循環(huán)依賴支持
spring: main: allow-circular-references:true #允許循環(huán)引用
第二種、懶加載
@Lazy:配合使用該注解可以解決循環(huán)依賴問題(在需要注入Bean的地方加上該注解)
@Lazy // 使用懶加載 @Autowired private OneService oneService;
第三種、控制反轉(zhuǎn)
@Service @RequiredArgsConstructor // 該注解的使用在下面會有介紹和說明 public class OneServiceImpl implements OneService { private final ConfigurableListableBeanFactory beanFactory; //代替循環(huán)依賴 public TwoService getTwoService(){ return beanFactory.getBean(TwoService.class); } }
使用
getTwoService()
直接從bean工廠里面去拿對應的Bean來使用
@Service @RequiredArgsConstructor // 該注解的使用在下面會有介紹和說明 public class TwoServiceImpl implements TwoService { private final ConfigurableListableBeanFactory beanFactory; //代替循環(huán)依賴 public OneService getOneService(){ return beanFactory.getBean(OneService.class); } }
以上代碼中,OneService依賴于TwoService,而TwoService也依賴于OneService,從而產(chǎn)生循環(huán)依賴
解決:每次使用的時候就去Bean工廠里去獲取,這樣就不存在循環(huán)依賴了
@RequiredArgsConstructor使用說明
@RequiredArgsConstructor
:該注解是由Lombok
提供,可以解決掉大量重復的@Autowired
代碼
注意:使用@RequiredArgsConstructor
時,需要使用final
關鍵字
寫在類上可以代替@Autowired注解,需要注意的是在注入時需要用final定義,或者使用@notnull注解
@RestController @RequiredArgsConstructor // 代替@Autowired注解 @RequestMapping("/api/v1/one") public class OneController{ private final OneService oneService; // 需要final關鍵字 private final TwoService twoService; // 需要final關鍵字 @GetMapping("{id}") public ResultVo<String> getDetails(@PathVariable("id") Long id){ return ResultVo.ok(oneService.getDetailsById(id)); } }
注意點:
1、必須聲明的變量為final。
2、根據(jù)構(gòu)造器注入的,相當于容器調(diào)用帶有一組帶有參數(shù)的類構(gòu)造函數(shù)時,基于構(gòu)造函數(shù)的 DI 就完成了,其中每個參數(shù)代表一個對其他類的依賴?;跇?gòu)造方法為屬性賦值,容器通過調(diào)用類的構(gòu)造方法將其進行依賴注入。
3、當需要注入Bean的時候可以直接在類名稱上使用@RequiredArgsConstructor,從而代替了大量的@Autowrited注解。
到此這篇關于SpringBoot3.x循環(huán)依賴的文章就介紹到這了,更多相關SpringBoot循環(huán)依賴內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用IDEA直接連接MySQL數(shù)據(jù)庫的方法
這篇文章主要介紹了如何使用IDEA直接連接MySQL數(shù)據(jù)庫,首先需要新建一個空項目,第一次連接 需要先下載驅(qū)動,文中給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-04-04SpringBoot全局異常捕獲參數(shù)以及參數(shù)異常的解決方案
這篇文章主要介紹了SpringBoot全局異常捕獲參數(shù)以及參數(shù)異常的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05Java SpringMVC 異常處理SimpleMappingExceptionResolver類詳解
這篇文章主要介紹了SpringMVC 異常處理SimpleMappingExceptionResolver類詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09