女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于Spring的循環依賴問題

Android編程精選 ? 來源:博客園 ? 作者:青石路 ? 2022-06-14 17:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前情回顧

一探

Spring 的循環依賴,源碼詳細分析 → 真的非要三級緩存嗎中講到了循環依賴問題

同樣說明了Spring只能解決setter方式的循環依賴,不能解決構造方法的循環依賴

重點介紹了Spring是如何解決setter方式的循環依賴,感興趣的可以去看下

二探

既然Spring不能解決構造方法的循環依賴,那么它是如何甄別構造方法循環依賴的了?

所以進行了二探:再探循環依賴 → Spring 是如何判定原型循環依賴和構造方法循環依賴的?

從源碼的角度講述了Spring是如何判定構造方法循環依賴、原型循環依賴的

感興趣的可以去看下

大家跟源碼的時候,一定要注意版本!!!

項目模擬

自認為經過了前兩探,對Spring循環依賴的問題已了若指掌,可面對線上突如其來的循環依賴問題,樓主竟然沒能一眼看出來!!!

這樓主能忍?于是樓主又跟起了Spring源碼,看看問題到底出在哪?

SpringBoot版本是2.0.3.RELEASE

線上服務采用k8s部署,本地環境未采用k8s部署

本地啟動從未出現循環依賴問題,線上環境也只是偶發的pod啟動失敗(提示信息直指循環依賴)

問題偶發,而非必現,很是頭疼,但問題還是得解決,從提示信息著手唄

根據錯誤提示信息,樓主模擬出了一個簡化的工程,方便我們進行問題排查

eefcb9ae-d443-11ec-bce3-dac502259ad0.png

非常簡單,完整地址:spring-other-circular-reference

我們來看下類圖

ef226186-d443-11ec-bce3-dac502259ad0.png

MyListenerMyServiceMyManager很常規,特殊的是MyConfigMySender

ef484bda-d443-11ec-bce3-dac502259ad0.png

ef60c5e8-d443-11ec-bce3-dac502259ad0.png

問題復現

如果按上述工程結構,本地很難復現問題 ,反正樓主是沒復現出來

我們稍做調整,將MySender前置,如下

ef9f542a-d443-11ec-bce3-dac502259ad0.gif

啟動失敗,錯誤信息如下:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myConfig': Unsatisfied dependency expressed through field 'myListener'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myListener': Unsatisfied dependency expressed through field 'myService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myServiceImpl': Unsatisfied dependency expressed through field 'myManager'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myManager': Unsatisfied dependency expressed through field 'mySender'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'mySender': Requested bean is currently in creation: Is there an unresolvable circular reference?

此刻的Is there an unresolvable circular reference?讓樓主感到了陌生

問題分析

我們從以下幾個方面來分析

BeanDefinition 掃描

目前XML方式的Bean定義越來越少,除了一些遺留的老項目,基本看不到XML方式的Bean定義了

所以我們只關注注解方式的Bean定義的掃描

文件夾的掃描順序與文件夾名字的升序一致,文件的順序與文件名的升序一致,如下所示

f06ca5ce-d443-11ec-bce3-dac502259ad0.png

有興趣的可以去跟下ConfigurationClassParser類中doProcessConfigurationClass方法;樓主做了下簡單的總結

f0849e04-d443-11ec-bce3-dac502259ad0.png

@ComponentScan的處理早于@Bean

BeanDefinition掃描過程中,會按掃描順序會往DefaultListableBeanFactorybeanDefinitionMap中添加BeanDefinition,往beanDefinitionNames添加BeanName

我們來跟下源碼,看是不是如上所說

f0c444c8-d443-11ec-bce3-dac502259ad0.gif

先被掃描的BeanDefinitionBeanName會被先添加到beanDefinitionNames

BeanDefinition 覆蓋

MyConfig中通過@Bean定義了MySender,而MySender類上又用了@Component進行修飾

那創建MySender實例的時候到底調用的哪個構造方法?(有參還是無參?)

關于 Spring Boot 中創建對象的疑慮 → @Bean 與 @Component 同時作用同一個類,會怎么樣?從源碼的角度分析了這個問題

結論是:SpringBoot 2.0.3.RELEASE中,@Configuration + @Bean修飾的BeanDefinition會覆蓋掉@Component修飾的BeanDefinition

也就說MySender類上的@Component其實沒用,加不加效果是一樣的,這里說的沒用效果僅僅指的是MySenderBeanDefinition

Bean 實例化順序

BeanDefinition用來構建實例,那么MySender上的@Component就有作用了,它決定了MySender的實例化順序

是先于MyConfigMyListenerMyServiceImplMyManager實例化的

我們來看下Bean的實例化順序

f164c63c-d443-11ec-bce3-dac502259ad0.gif

理論上來講,先被掃描的Bean會先被實例化;Bean實例化的過程中會填充屬性,可能會導致后被掃描的Bean提前被實例化

如果Bean之間沒有依賴,那么會嚴格按照Bean的掃描順序實例化

再看問題

我們再回到前面的問題

f20bec64-d443-11ec-bce3-dac502259ad0.png

這種情況下,我們分析下Is there an unresolvable circular reference?是如何產生的

相較于MyConfigMyListenerMyManagerMyServiceImplMySender是最先被掃描到的,所以它最先被實例化

因為MyConfig中通過@Bean修飾了MySenderBeanDefinition

f28332ba-d443-11ec-bce3-dac502259ad0.png

會覆蓋掉MySender自身的無參BeanDefinition

所以會通過MySender的有參構造方法來創建MySender實例

因為有參構造方法依賴myListener,所以去Spring容器中找MyListener實例,沒有找到則創建,然后填充MyListener實例的屬性

以此類推,實例的創建過程如下所示:

f2d5de3e-d443-11ec-bce3-dac502259ad0.png

Is there an unresolvable circular reference?就此產生

相當于是變種的構造方法循環依賴

最初狀態

我們還原MySender位置

f2f71892-d443-11ec-bce3-dac502259ad0.png

此時最先實例化的是MyConfig,實例化過程如下

f320f982-d443-11ec-bce3-dac502259ad0.png

對象是都可以正常實例化、初始化的

這種情況理論上來講是不會出現Is there an unresolvable circular reference?

線上問題

一通分析下來,還是沒能找到線上Is there an unresolvable circular reference?的原因

很是尷尬,但是我萌生了這樣的想法:是不是在k8s部署過程中,BeanDefinition的掃描會有偶發的隨機性?

問題修復

雖然我們沒能找到線上問題的確切原因,但還是有辦法去根治這個問題的

Spring不能處理構造方法循環依賴,那我們就去規避它

刪掉MyConfigMySender改成

f34d389e-d443-11ec-bce3-dac502259ad0.png

MySender改成

f3695b96-d443-11ec-bce3-dac502259ad0.png

還有@PostConstruct等,方式有很多,只要不產生構造方法循環依賴就好

總結

1、BeanDefinition掃描順序

如果我們去跟源代碼就會發現,以啟動類為起點,掃描啟動類同級目錄下的所有文件夾

按文件夾名升序順序進行掃描,會遞歸掃描每個文件夾

文件掃描也是按文件名升序順序進行

從線上問題來看,對這個掃描順序,樓主是持懷疑態度的:是Spring會偶發的隨機掃描,還是pod會導致偶發的隨機掃描

2、BeanDefinition覆蓋

只要我們讀了源碼,了解Spring對各個注解的掃描順序,就清楚它們的替換關系了

BeanDefinition覆蓋并不會影響BeanDefinition的掃描順序

也就是不會改變BeanNamebeanDefinitionNames中的位置,即不會影響Bean的示例化順序

3、Bean實例化順序

理論上來講,先被掃描到的就先被實例化,但實例化過程中的屬性填充會打亂這個順序,會將被依賴的對象提前實例化

4、Spring版本

?一定要結合版本來看問題

版本不同,底層實現可能會不同

原文標題:記一次線上偶現的Spring循環依賴問題

文章出處:【微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 源碼
    +關注

    關注

    8

    文章

    670

    瀏覽量

    30255
  • 循環
    +關注

    關注

    0

    文章

    92

    瀏覽量

    16290
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14992

原文標題:記一次線上偶現的Spring循環依賴問題

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    java spring教程

    Spring核心概念介紹控制反轉(IOC)依賴注入(DI)集合對象注入等Bean的管理BeanFactoryApplicationContextSpring 在web中的使用
    發表于 09-11 11:09

    什么是java spring

    。在SSH項目中管理事務以及對象的注入Spring是非侵入式的:基于Spring開發的系統中的對象一般不依賴Spring的類。組成 Spring
    發表于 09-11 11:16

    Spring工作原理

    依賴關系核心:bean工廠;在Spring中,bean工廠創建的各個實例稱作bean二.AOP(Aspect-Oriented Programming): 面向方面編程1.代理的兩種方式:靜態代理
    發表于 07-10 07:41

    Spring筆記分享

    ; 可以管理所有的組件(類)Spring的優良特性1) 非侵入式:基于Spring開發的應用中的對象可以不依賴Spring的API2) 依賴
    發表于 11-04 07:51

    spring教程ppt

    主要內容Spring 概述Spring 整體結構Spring實例Spring核心概念介紹控制反轉(IOC)依賴注入(DI)
    發表于 09-11 11:00 ?138次下載
    <b class='flag-5'>spring</b>教程ppt

    Spring認證」什么是Spring GraphQL?

    spring-boot-starter-webflux HTTP、WebSocket 彈簧 WebFlux 依賴{ ? ?實現 'org.springframework.experimental
    的頭像 發表于 08-10 14:08 ?1015次閱讀
    「<b class='flag-5'>Spring</b>認證」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring開發過程中依賴注入的幾個知識點

    轉自丨https://juejin.cn/post/6844904056230690824 本章的內容主要是想探討我們在進行 Spring 開發過程當中,關于依賴注入的幾個知識點。感興趣的讀者可以
    的頭像 發表于 08-27 09:18 ?1844次閱讀

    Spring Validation的使用

    之前也寫過一篇關于Spring Validation使用的文章,不過自我感覺還是浮于表面,本次打算徹底搞懂Spring Validation。本文會詳細介紹Spring Validat
    的頭像 發表于 09-08 10:31 ?1090次閱讀

    從源碼層面深度剖析Spring循環依賴

    參考圖中 spring 解決循環依賴 的過程可知,spring 利用三級緩中的 objectFactory 生成并返回一個 early 對象,提前暴露這個 early 地址,供其他對象
    的頭像 發表于 12-22 10:34 ?710次閱讀

    怎樣使用Kiuwan保護Spring Boot應用程序呢?

    Spring Boot 提供了快速輕松地構建基于Spring 的應用程序所需的工具、功能和依賴項。
    的頭像 發表于 03-16 09:10 ?1054次閱讀

    SpringBoot循環依賴的癥狀和解決方案

    循環依賴是指在Spring Boot 應用程序中,兩個或多個類之間存在彼此依賴的情況,形成一個循環依賴
    的頭像 發表于 05-06 15:30 ?1080次閱讀

    Spring Boot的啟動原理

    可能很多初學者會比較困惑,Spring Boot 是如何做到將應用代碼和所有的依賴打包成一個獨立的 Jar 包,因為傳統的 Java 項目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發表于 10-13 11:44 ?916次閱讀
    <b class='flag-5'>Spring</b> Boot的啟動原理

    Spring Boot 的設計目標

    ,這樣我們就可以盡快的上手。 使用 Spring Boot 來不僅可以創建基于 war 方式部署的傳統Java應用程序,也可以通過創建獨立的不依賴任何容器(如 tomcat 等)
    的頭像 發表于 10-13 14:56 ?786次閱讀
    <b class='flag-5'>Spring</b> Boot 的設計目標

    Spring依賴注入的方式

    Spring 是一個開源的輕量級框架,可以用于構建企業級應用程序。其最重要的特性之一是依賴注入(Dependency Injection,DI),這是一種設計模式,它可以幫助我們解耦代碼、提高
    的頭像 發表于 11-22 15:12 ?756次閱讀

    Spring依賴注入的四種方式

    Spring框架中,依賴注入是一種核心的概念和機制。通過依賴注入,我們可以讓對象之間的依賴關系更加松散,并且能夠方便地進行單元測試和模塊化開發。在
    的頭像 發表于 12-03 15:11 ?2492次閱讀
    主站蜘蛛池模板: 北川| 皋兰县| 肥东县| 湛江市| 仙桃市| 常山县| 阿合奇县| 河南省| 台前县| 白银市| 元谋县| 迁安市| 黔西县| 洛扎县| 晋城| 开阳县| 巩留县| 乌兰浩特市| 济南市| 隆昌县| 都江堰市| 酉阳| 盐津县| 富平县| 民乐县| 华蓥市| 枞阳县| 登封市| 津南区| 朝阳区| 北票市| 邯郸市| 宜宾市| 嘉善县| 中阳县| 平谷区| 恩平市| 广灵县| 宁夏| 宁陕县| 保康县|