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

您的位置:首頁技術文章
文章詳情頁

基于SpringBoot構造器注入循環依賴及解決方式

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

1. 循環依賴是什么?

Bean A 依賴 B,Bean B 依賴 A這種情況下出現循環依賴。

Bean A → Bean B → Bean A

更復雜的間接依賴造成的循環依賴如下。

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

2. 循環依賴會產生什么結果?

當Spring正在加載所有Bean時,Spring嘗試以能正常創建Bean的順序去創建Bean。

例如,有如下依賴:

Bean A → Bean B → Bean C

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

但當存在循環依賴時,Spring將無法決定先創建哪個bean。這種情況下,Spring將產生異常BeanCurrentlyInCreationException。

當使用構造器注入時經常會發生循環依賴問題。如果使用其它類型的注入方式能夠避免這種問題。

3. 構造器注入循環依賴實例

首先定義兩個相互通過構造器注入依賴的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將會產生異常:

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

4.解決方法

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

4.1 重新設計

重新設計結構,消除循環依賴。

4.2 使用注解 @Lazy

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

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

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

4.3 使用Setter/Field注入

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

@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 實現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.總結

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

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品.xx视频.xxtv| 国产伦精品一区二区三区千人斩| 欧美国产中文高清| 国产日韩1区| 国产精品调教| 久久久久观看| 国产精品igao视频网网址不卡日韩 | 日本亚洲不卡| 丝袜美腿一区二区三区| 久久午夜精品| 亚洲乱码久久| 欧美精品三级在线| 久久的色偷偷| 97精品国产福利一区二区三区| 狠狠躁少妇一区二区三区| 久久国产日韩| 日韩在线一区二区| 日韩av中文字幕一区| 国产精品三p一区二区| 精品久久不卡| 桃色一区二区| 日韩亚洲国产欧美| 视频国产精品| 久久伊人国产| 成人在线视频免费看| 久久免费高清| 鲁大师影院一区二区三区| 69堂精品视频在线播放| 精品国产亚洲一区二区三区在线 | 国产日韩中文在线中文字幕| 国产精品2023| 久久婷婷一区| 日本一区免费网站| 麻豆国产欧美一区二区三区| 日韩欧美另类一区二区| 亚洲专区一区| 国产精品亚洲一区二区在线观看| 国产精品毛片久久| 亚洲欧美日韩精品一区二区| 国产另类在线| 久久久精品久久久久久96| 日韩一区精品视频| 国产精品2023| 欧美久久精品一级c片| 亚洲精品九九| а√天堂8资源中文在线| 久久国产福利| 欧美激情五月| 国产精品99免费看| 日韩欧美激情| 欧美日韩精品免费观看视欧美高清免费大片| 免费中文字幕日韩欧美| 精品伊人久久久| 午夜欧美在线| 国产精品亚洲四区在线观看| 1000部精品久久久久久久久| 日本va欧美va精品| 一区二区三区视频免费观看 | 喷白浆一区二区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 美女少妇全过程你懂的久久| 日本欧美一区二区| 久久久久一区| 久久国产精品色av免费看| 久久久久亚洲| 国产精品亚洲综合色区韩国| 国产精品人人爽人人做我的可爱| 美女视频黄免费的久久| 日韩影院免费视频| 韩国久久久久久| 日本va欧美va精品发布| 欧美精品自拍| 福利片在线一区二区| 日韩一区二区三区精品视频第3页| 中文字幕在线视频久| 奇米色欧美一区二区三区| 久久九九精品| 精品中文在线| 日本午夜精品一区二区三区电影| 国产99久久久国产精品成人免费| 911精品国产| 视频一区二区国产| 久久精品国产大片免费观看| 麻豆精品视频在线观看视频| 一区二区精彩视频| 99热精品久久| 国产精品yjizz视频网| 日本麻豆一区二区三区视频| 1024精品久久久久久久久| 日韩av有码| 国产精品蜜月aⅴ在线| 手机精品视频在线观看| 日本精品影院| 福利片在线一区二区| 国产精区一区二区| 亚洲影视一区二区三区| 妖精视频成人观看www| 欧洲av一区二区| 狠狠久久伊人| 国产日韩一区二区三区在线| 欧美一级二级视频| 日本中文字幕一区二区视频| 久热re这里精品视频在线6| 不卡在线一区| 亚洲a在线视频| 日韩综合精品| 国产a久久精品一区二区三区| 久久99视频| 国产精品一区二区精品| 国产日韩欧美一区二区三区在线观看 | 91久久黄色| 香蕉久久精品| 久久在线视频免费观看| 日韩电影免费网站| 黄在线观看免费网站ktv| 久久精品国产成人一区二区三区| 国产欧美日韩在线观看视频| 日韩高清一级| 久久国产乱子精品免费女| 国产午夜久久av| 国产精品久久久久久久久免费高清| 欧美性www| 免费视频一区二区三区在线观看| 鲁大师精品99久久久| 国产高清亚洲| 精品久久国产一区| 欧美激情国产在线| 日韩久久精品| 色婷婷狠狠五月综合天色拍| 久久九九99| 宅男噜噜噜66国产日韩在线观看| 亚洲少妇一区| 亚洲一区二区三区久久久| 亚洲精品少妇| 国产精品亚洲产品| 精品欧美视频| 日本免费一区二区三区四区| 99国产精品免费视频观看| 国内精品福利| 激情欧美一区| 99视频+国产日韩欧美| 免费看欧美美女黄的网站| 亚洲精品欧美| 麻豆91精品视频| 日本在线精品| 黄色日韩精品| 中文字幕一区二区av| 日韩av不卡一区二区| 欧美国产亚洲精品| 日韩黄色大片网站| 婷婷色综合网| 亚洲一二av| 美女久久精品| 激情久久五月| 中文字幕日本一区二区| 国产欧美日韩精品高清二区综合区 | 成人av动漫在线观看| 亚洲深爱激情| 国产麻豆精品久久| 日本一区二区免费高清| 欧美午夜不卡| 亚洲人成在线影院| 久久精品亚洲| 亚洲精品中文字幕乱码| 日韩激情中文字幕| 国产精品13p| 亚洲欧美日韩专区| 国产精品日本一区二区不卡视频 | 伊人精品一区| 日韩和欧美一区二区| 精品一区二区三区中文字幕在线| 日韩激情一区| 蜜臀va亚洲va欧美va天堂| 国产精品不卡| 日韩精品成人| av亚洲一区二区三区| 亚洲欧洲日韩| 国产精品视频一区二区三区| 中文字幕在线视频网站| 女人天堂亚洲aⅴ在线观看| 午夜国产精品视频免费体验区| 国产精品一区二区精品视频观看| 成人在线观看免费视频| 国产黄色精品| 亚洲三级网址| 精品香蕉视频| 红桃视频欧美| 欧美黑人做爰爽爽爽| 狠狠操综合网| 国产日产精品_国产精品毛片| 播放一区二区| 日韩av网站在线观看| 久久精品卡一| 国产一精品一av一免费爽爽| 999国产精品999久久久久久| 亚洲乱码久久| 影视先锋久久| 精品少妇av| 久久亚洲风情| 久久伦理在线|