最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot配置允許循環(huán)依賴問題

 更新時間:2023年05月19日 14:36:15   作者:keep one's resolveY  
這篇文章主要介紹了springboot配置允許循環(huán)依賴問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot配置允許循環(huán)依賴

循環(huán)依賴報錯

當啟動項目時,可能出現(xiàn)程序不能啟動的情況,查看調(diào)試日志

會提示 :

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

原因

SpringBoot 從 2.6 開始默認不允許出現(xiàn) Bean 循環(huán)引用。而且這個是在Bean 定義上也就是類上就不允許出現(xiàn)循環(huán)引用。

解決方式       

1、允許循環(huán)引用存在               

方式1.在全局配置文件設(shè)置允許循環(huán)引用存在:

spring:
? main:
? ? allow-circular-references:true? ? ? 

方式2.在SpringApplicationBuilder 添加設(shè)置允許循環(huán)引用:

public static void main(String[] args) {
? new SpringApplicationBuilder(DemoApplication.class).allowCircularReferences(true).run(args);
}? ? ? ??

2、消除循環(huán)依賴               

Spring官方的初心是不希望開發(fā)者編寫循環(huán)引用的代碼,也就是說未來的某個版本可能強制不能使用循環(huán)引用,因此在項目中消除循環(huán)依賴是不得不面對的問題。

面試官:”Spring是如何解決的循環(huán)依賴?“

答:Spring通過三級緩存解決了循環(huán)依賴,其中一級緩存為單例池(singletonObjects),二級緩存為早期曝光對象earlySingletonObjects,三級緩存為早期曝光對象工廠(singletonFactories)。

當A、B兩個類發(fā)生循環(huán)引用時,在A完成實例化后,就使用實例化后的對象去創(chuàng)建一個對象工廠,并添加到三級緩存中,如果A被AOP代理,那么通過這個工廠獲取到的就是A代理后的對象,如果A沒有被AOP代理,那么這個工廠獲取到的就是A實例化的對象。

當A進行屬性注入時,會去創(chuàng)建B,同時B又依賴了A,所以創(chuàng)建B的同時又會去調(diào)用getBean(a)來獲取需要的依賴,此時的getBean(a)會從緩存中獲取,第一步,先獲取到三級緩存中的工廠;第二步,調(diào)用對象工工廠的getObject方法來獲取到對應(yīng)的對象,得到這個對象后將其注入到B中。

緊接著B會走完它的生命周期流程,包括初始化、后置處理器等。當B創(chuàng)建完后,會將B再注入到A中,此時A再完成它的整個生命周期。至此,循環(huán)依賴結(jié)束!

面試官:”為什么要使用三級緩存呢?二級緩存能解決循環(huán)依賴嗎?“

答:如果要使用二級緩存解決循環(huán)依賴,意味著所有Bean在實例化后就要完成AOP代理,這樣違背了Spring設(shè)計的原則,Spring在設(shè)計之初就是通過AnnotationAwareAspectJAutoProxyCreator這個后置處理器來在Bean生命周期的最后一步來完成AOP代理,而不是在實例化后就立馬進行AOP代理。

SpringBoot禁用循環(huán)依賴

Spring的Bean管理,一直是整個體系中津津樂道的東西。尤其是Bean的循環(huán)依賴,更是很多面試官最喜歡考察的2B知識點之一。

但事實上,項目中存在Bean的循環(huán)依賴,是代碼質(zhì)量低下的表現(xiàn)。多數(shù)人寄希望于框架層來給擦屁股,造成了整個代碼的設(shè)計越來越糟,最后用一些奇技淫巧來填補犯下的錯誤。

還好,SpringBoot終于受不了這種濫用,默認把循環(huán)依賴給禁用了!

從2.6版本開始,如果你的項目里還存在循環(huán)依賴,SpringBoot將拒絕啟動!

驗證代碼小片段

為了驗證這個功能,我們只需要兩段小代碼。

CircularDependencyA.java

@Component
@RequiredArgsConstructor
public class CircularDependencyA {
    private final CircularDependencyB circB;
}

CircularDependencyB.java

@Component
@RequiredArgsConstructor
public class CircularDependencyB {
    private final CircularDependencyA circA;
}

RequiredArgsConstructor注解,是lombok包里面的,用來實現(xiàn)簡單的構(gòu)造器注入。不出所料,當我們啟動代碼的時候,報錯了~~

報錯如下:

The dependencies of some of the beans in the application context form a cycle:
┌─────┐
|  circularDependencyA defined in file [cir/CircularDependencyA.class]
↑     ↓
|  circularDependencyB defined in file [cir/CircularDependencyB.class]
└─────┘
 
Action:
 
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

當然,有些鳥人已經(jīng)玩大了,循環(huán)依賴到處都是,改代碼變的越來越不現(xiàn)實。那你還可以通過在yaml里配置參數(shù)來臨時開啟循環(huán)依賴。

spring.main.allow-circular-references=true

看來SpringBoot對惡勢力的容忍能力還是不夠堅決??!

繞過SpringBoot這個攔截的方法不止一種,比如使用@Lazy注解進行延遲初始化。但這些都是治標不治本,辜負了SpringBoot的一片苦心。

做對的事

其實,我們一直把代碼往下找下去,會發(fā)現(xiàn)這個開關(guān),其實是Spring的功能。

AbstractAutowireCapableBeanFactory#allowCircularReferences
/** Whether to automatically try to resolve circular references between beans. */
private boolean allowCircularReferences = true;

很長一段時間,SpringBoot這個值都是默認為true的。但這種縱容造成了大批低質(zhì)量的代碼產(chǎn)生,以至于新員工一直在給老員工擦屁股。

把這個值默認設(shè)置為false,是堅持做對的事情。起碼,在工程師編寫出質(zhì)量不高的代碼時,能夠知道他自己在做什么,而不是把隱患一步步的推遲,任代碼腐敗。

不得不為SpringBoot點個贊。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java讀寫鎖ReadWriteLock的創(chuàng)建使用及測試分析示例詳解

    Java讀寫鎖ReadWriteLock的創(chuàng)建使用及測試分析示例詳解

    這篇文章主要為大家介紹了Java讀寫鎖ReadWriteLock的創(chuàng)建使用及測試分析示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Java結(jié)構(gòu)型設(shè)計模式之橋接模式詳細講解

    Java結(jié)構(gòu)型設(shè)計模式之橋接模式詳細講解

    橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實現(xiàn)部分分離解耦,使他們可以獨立的變化。本文通過示例詳細介紹了橋接模式的原理與使用,需要的可以參考一下
    2022-09-09
  • Java Socket編程心跳包創(chuàng)建實例解析

    Java Socket編程心跳包創(chuàng)建實例解析

    這篇文章主要介紹了Java Socket編程心跳包創(chuàng)建實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • spring boot如何基于JWT實現(xiàn)單點登錄詳解

    spring boot如何基于JWT實現(xiàn)單點登錄詳解

    這篇文章主要介紹了spring boot如何基于JWT實現(xiàn)單點登錄詳解,用戶只需登錄一次就能夠在這兩個系統(tǒng)中進行操作。很明顯這就是單點登錄(Single Sign-On)達到的效果,需要的朋友可以參考下
    2019-06-06
  • TK-MyBatis 分頁查詢的具體使用

    TK-MyBatis 分頁查詢的具體使用

    分頁查詢在很多地方都可以使用到,本文就詳細的介紹了一下TK-MyBatis 分頁查詢的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Springboot中MyBatisplus使用IPage和Page分頁的實例代碼

    Springboot中MyBatisplus使用IPage和Page分頁的實例代碼

    這篇文章主要介紹了Springboot中MyBatisplus使用IPage和Page分頁,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • slf4j使用log4j的配置參數(shù)方式

    slf4j使用log4j的配置參數(shù)方式

    這篇文章主要介紹了slf4j使用log4j的配置參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java網(wǎng)約車項目實戰(zhàn)之實現(xiàn)搶單功能詳解

    Java網(wǎng)約車項目實戰(zhàn)之實現(xiàn)搶單功能詳解

    本文詳細介紹了如何使用Java實現(xiàn)網(wǎng)約車項目的搶單功能,并提供了一個完整的代碼示例,以便讀者能夠直接運行和參考,感興趣的朋友一起看看吧
    2024-12-12
  • Java入門之繼承多態(tài)使用及說明

    Java入門之繼承多態(tài)使用及說明

    文章概述Java繼承與多態(tài)的核心概念,包括繼承的共性抽取、子類父類關(guān)系、super關(guān)鍵字的使用、構(gòu)造方法與代碼塊執(zhí)行順序,以及向上轉(zhuǎn)型、動態(tài)綁定和重寫機制,最后預(yù)告多態(tài)內(nèi)容并附練習(xí)題
    2025-09-09
  • Java將Word轉(zhuǎn)換成PDF的常用用法

    Java將Word轉(zhuǎn)換成PDF的常用用法

    Java開發(fā)人員在處理文檔轉(zhuǎn)換時,常常需要將Word或Excel文檔轉(zhuǎn)換為PDF格式,以便于更好地保持格式一致性、便于分發(fā)和打印,這篇文章主要給大家介紹了關(guān)于Java將Word轉(zhuǎn)換成PDF的常用用法,需要的朋友可以參考下
    2024-08-08

最新評論

通辽市| 宁都县| 中卫市| 沂源县| 夹江县| 社旗县| 高邑县| 咸宁市| 黄山市| 峨山| 达孜县| 贵州省| 永寿县| 金堂县| 麻城市| 融水| 鄢陵县| 朝阳区| 兴国县| 定结县| 虹口区| 怀化市| 长宁县| 文山县| 巴林左旗| 礼泉县| 临汾市| 罗源县| 新化县| 黄陵县| 哈尔滨市| 梅州市| 崇阳县| 全州县| 习水县| 邯郸县| 乌拉特后旗| 昆明市| 成都市| 兴宁市| 随州市|