日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

基于SpringBoot構(gòu)造器注入循環(huán)依賴及解決方式

瀏覽:22日期:2023-05-20 16:50:26

1. 循環(huán)依賴是什么?

Bean A 依賴 B,Bean B 依賴 A這種情況下出現(xiàn)循環(huán)依賴。

Bean A → Bean B → Bean A

更復(fù)雜的間接依賴造成的循環(huán)依賴如下。

Bean A → Bean B → Bean C → Bean D → Bean E → Bean A

2. 循環(huán)依賴會產(chǎn)生什么結(jié)果?

當(dāng)Spring正在加載所有Bean時,Spring嘗試以能正常創(chuàng)建Bean的順序去創(chuàng)建Bean。

例如,有如下依賴:

Bean A → Bean B → Bean C

Spring先創(chuàng)建beanC,接著創(chuàng)建bean B(將C注入B中),最后創(chuàng)建bean A(將B注入A中)。

但當(dāng)存在循環(huán)依賴時,Spring將無法決定先創(chuàng)建哪個bean。這種情況下,Spring將產(chǎn)生異常BeanCurrentlyInCreationException。

當(dāng)使用構(gòu)造器注入時經(jīng)常會發(fā)生循環(huán)依賴問題。如果使用其它類型的注入方式能夠避免這種問題。

3. 構(gòu)造器注入循環(huán)依賴實例

首先定義兩個相互通過構(gòu)造器注入依賴的bean。

@Componentpublic class CircularDependencyA { private CircularDependencyB circB; @Autowired public CircularDependencyA(CircularDependencyB circB) { this.circB = circB; }}

@Componentpublic class CircularDependencyB { private CircularDependencyA circA; @Autowired public CircularDependencyB(CircularDependencyA circA) { this.circA = circA; }}

@Configuration@ComponentScan(basePackages = { 'com.baeldung.circulardependency' })public class TestConfig {}

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = { TestConfig.class })public class CircularDependencyTest { @Test public void givenCircularDependency_whenConstructorInjection_thenItFails() { // Empty test; we just want the context to load }}

運行方法givenCircularDependency_whenConstructorInjection_thenItFails將會產(chǎn)生異常:

BeanCurrentlyInCreationException: Error creating bean with name ‘circularDependencyA’: Requested bean is currently in creation: Is there an unresolvable circular reference?

4.解決方法

處理這種問題目前有如下幾種常見方式。

4.1 重新設(shè)計

重新設(shè)計結(jié)構(gòu),消除循環(huán)依賴。

4.2 使用注解 @Lazy

一種最簡單的消除循環(huán)依賴的方式是通過延遲加載。在注入依賴時,先注入代理對象,當(dāng)首次使用時再創(chuàng)建對象完成注入。

@Componentpublic class CircularDependencyA { private CircularDependencyB circB; @Autowired public CircularDependencyA(@Lazy CircularDependencyB circB) { this.circB = circB; }}

使用@Lazy后,運行代碼,可以看到異常消除。

4.3 使用Setter/Field注入

Spring文檔建議的一種方式是使用setter注入。當(dāng)依賴最終被使用時才進(jìn)行注入。對前文的樣例代碼少做修改,來觀察測試效果。

@Componentpublic class CircularDependencyA { private CircularDependencyB circB; @Autowired public void setCircB(CircularDependencyB circB) { this.circB = circB; } public CircularDependencyB getCircB() { return circB; }}

@Componentpublic class CircularDependencyB { private CircularDependencyA circA; private String message = 'Hi!'; @Autowired public void setCircA(CircularDependencyA circA) { this.circA = circA; } public String getMessage() { return message; }}

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = { TestConfig.class })public class CircularDependencyTest { @Autowired ApplicationContext context; @Bean public CircularDependencyA getCircularDependencyA() { return new CircularDependencyA(); } @Bean public CircularDependencyB getCircularDependencyB() { return new CircularDependencyB(); } @Test public void givenCircularDependency_whenSetterInjection_thenItWorks() { CircularDependencyA circA = context.getBean(CircularDependencyA.class); Assert.assertEquals('Hi!', circA.getCircB().getMessage()); }}

4.4 使用@PostConstruct

@Componentpublic class CircularDependencyA { @Autowired private CircularDependencyB circB; @PostConstruct public void init() { circB.setCircA(this); } public CircularDependencyB getCircB() { return circB; }}

@Componentpublic class CircularDependencyB { private CircularDependencyA circA; private String message = 'Hi!'; public void setCircA(CircularDependencyA circA) { this.circA = circA; } public String getMessage() { return message; }

4.5 實現(xiàn)ApplicationContextAware與InitializingBean

@Componentpublic class CircularDependencyA implements ApplicationContextAware, InitializingBean { private CircularDependencyB circB; private ApplicationContext context; public CircularDependencyB getCircB() { return circB; } @Override public void afterPropertiesSet() throws Exception { circB = context.getBean(CircularDependencyB.class); } @Override public void setApplicationContext(final ApplicationContext ctx) throws BeansException { context = ctx; }}

@Componentpublic class CircularDependencyB { private CircularDependencyA circA; private String message = 'Hi!'; @Autowired public void setCircA(CircularDependencyA circA) { this.circA = circA; } public String getMessage() { return message; }}

5.總結(jié)

處理循環(huán)依賴有多種方式。首先考慮是否能夠通過重新設(shè)計依賴來避免循環(huán)依賴。如果確實需要循環(huán)依賴,那么可以通過前文提到的方式來處理。優(yōu)先建議使用setter注入來解決。

以上這篇基于SpringBoot構(gòu)造器注入循環(huán)依賴及解決方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费在线观看精品| 亚洲一区二区三区中文字幕在线观看| 激情自拍一区| 久久激情一区| 久久在线视频免费观看| 国产尤物精品| 天堂va蜜桃一区二区三区| 不卡一区2区| 六月婷婷一区| 日韩国产91| 久久永久免费| 欧美二三四区| 久久夜色精品| 国产亚洲人成a在线v网站| 视频一区日韩精品| 奇米狠狠一区二区三区| 久久久国产精品入口麻豆| www.九色在线| 亚洲国产成人精品女人| 在线精品国产亚洲| 国产精品igao视频网网址不卡日韩| 久久天堂影院| 亚洲五月婷婷| 国产精品一区二区精品视频观看| 麻豆成人91精品二区三区| 丰满少妇一区| 亚洲深夜福利| 六月丁香综合在线视频| 91精品蜜臀一区二区三区在线| 99精品国产一区二区三区| 蜜桃一区二区三区在线观看| 国产精品高清一区二区| 精品一区免费| 精品久久97| 日韩国产在线观看一区| 亚洲风情在线资源| 日韩黄色在线观看| 免费av一区| 你懂的网址国产 欧美| 亚洲欧美日韩综合国产aⅴ| 欧美xxxx性| 日本国产亚洲| 久久亚洲一区| 婷婷丁香综合| 日韩免费av| 国产一卡不卡| 亚洲精品福利| 美女久久一区| 99香蕉国产精品偷在线观看 | 麻豆精品av| 日韩激情一区二区| 综合国产视频| 99国产精品久久久久久久| 精品美女视频 | 国产在线观看91一区二区三区| 日韩视频一二区| 久久www成人_看片免费不卡| 91精品xxx在线观看| 精品视频91| 日本一二区不卡| 国产一区二区三区不卡av| 国产精品白丝一区二区三区| 欧美日韩视频免费看| 日本强好片久久久久久aaa| 综合欧美精品| 日韩一区二区三区精品| 欧美在线资源| 日韩一区二区三区在线免费观看| 日韩精品电影| 国产传媒在线观看| 波多野结衣久久精品| 一区二区精品伦理...| 国产精品13p| 91精品韩国| 亚洲精华国产欧美| 亚洲影视一区| 久久狠狠久久| jizzjizz中国精品麻豆| 99久久激情| 只有精品亚洲| av高清一区| 国产激情欧美| 国产精品7m凸凹视频分类| 日韩国产成人精品| 快she精品国产999| 青草av.久久免费一区| 国产乱码精品一区二区亚洲| 成人高清一区| 国产精品女主播一区二区三区| 日韩精品免费一区二区夜夜嗨| 精品视频在线一区二区在线| 国精品一区二区三区| 中文一区一区三区免费在线观 | 国产999精品在线观看| 91精品精品| 国产精品白丝av嫩草影院| 九一国产精品| 国产精品igao视频网网址不卡日韩| 日韩毛片视频| 国产日韩视频在线| 尤物在线精品| 国产精品13p| 日韩av三区| 欧洲激情综合| 麻豆成全视频免费观看在线看| 亚洲专区在线| 欧美成a人免费观看久久| 日韩精品中文字幕吗一区二区| 成人午夜网址| 欧美精品影院| 蜜桃久久av一区| 黑丝一区二区| 久久蜜桃精品| 丁香婷婷久久| 久久福利在线| 欧美日韩xxxx| 亚洲一二av| 日韩在线卡一卡二| 午夜久久美女| 日韩中文欧美| 国产aⅴ精品一区二区三区久久 | 国产亚洲一区二区三区啪| 蜜臀久久99精品久久久久宅男 | 日韩精品高清不卡| 亚洲精品中文字幕99999| 久久成人精品| 伊人久久亚洲| 日本精品一区二区三区在线观看视频| 亚洲欧洲一区二区天堂久久| 国产99精品| 久久高清精品| 亚洲免费高清| 中文无码日韩欧| 石原莉奈在线亚洲二区| 日av在线不卡| 日韩高清在线观看一区二区| 国产日韩欧美中文在线| 国产精品草草| 婷婷综合六月| 一区在线免费观看| 蜜桃av一区二区| 国产精品视频一区二区三区四蜜臂| 欧美天堂在线| 国产资源在线观看入口av| 久久久久网站| 日本v片在线高清不卡在线观看| 欧美亚洲tv| 亚洲日本网址| 免费视频国产一区| 日韩精品午夜视频| 91亚洲国产成人久久精品| 国内亚洲精品| 91精品美女| 亚洲成人不卡| 亚洲精品在线a| 成人在线免费观看91| 91久久中文| 福利精品在线| 视频一区二区三区在线| 精品网站999| 蜜桃久久久久久| 不卡一二三区| 欧美一级一区| 激情亚洲影院在线观看| 亚洲精品少妇| 欧美色图一区| 国产精品一区二区免费福利视频| 99久久精品费精品国产| 久久国际精品| 亚洲一区二区免费在线观看| 日韩理论片av| 你懂的网址国产 欧美| 日韩中文字幕1| 久久蜜桃av| 国产在线一区不卡| 国产日韩欧美一区| 亚洲午夜久久| 国产在线不卡| 成人在线黄色| 麻豆国产精品| 国产日韩精品视频一区二区三区| 午夜视频精品| 欧美日中文字幕| 久久夜夜操妹子| 成人亚洲欧美| 日韩大片在线| 日韩不卡在线| 韩国久久久久久| 精品欧美日韩精品| 久久精品国产成人一区二区三区| 国产视频一区二| 国产精品一国产精品| 日韩av影院| 亚州国产精品| 日韩va亚洲va欧美va久久| 日本色综合中文字幕| 日韩精品午夜视频| 国产精品xxxav免费视频| 欧美日韩一区二区三区四区在线观看 | 日韩一区二区三区免费播放|