日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring依赖注入_Spring的依赖注入陷阱

發(fā)布時間:2023/12/3 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring依赖注入_Spring的依赖注入陷阱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

spring依賴注入

Spring框架中有三種注入變量:

  • 基于二傳手的注射
  • 基于構(gòu)造函數(shù)的注入
  • 基于現(xiàn)場的注入

這些機制中的每一種都有優(yōu)點和缺點,并且不僅只有一種正確的方法。 例如現(xiàn)場注入:

@Autowired private FooBean fooBean;

在生產(chǎn)代碼中使用它通常不是最好的主意,主要是因為它使我們的bean無法在不啟動Spring上下文或不使用反射hack的情況下進行測試。 另一方面,它幾乎不需要其他代碼,并且可以在集成測試中使用-絕對不會獨立實例化。 我認為這是基于現(xiàn)場注射的唯一情況。

現(xiàn)在,讓我們集中討論兩個主要變體。 在Spring文檔中,我們可以讀到

…將構(gòu)造函數(shù)參數(shù)用于強制性依賴項并將設(shè)置器用于可選的依賴項是一個很好的經(jīng)驗法則。

同樣在參考Spring到3.1的文檔中 ,我們可以找到一個句子

Spring團隊通常提倡setter注入,因為大量的構(gòu)造函數(shù)參數(shù)可能變得笨拙,尤其是當(dāng)屬性是可選的時。

這種情況在文檔中已更改為第四版,其中指出:

Spring團隊通常提倡構(gòu)造函數(shù)注入,因為它使人們能夠?qū)?yīng)用程序組件實現(xiàn)為不可變對象,并確保所需的依賴項不為null。

尤其是在版本4.0之前的人們使用基于構(gòu)造函數(shù)的注入方法(其中也有些“純粹主義者”)(這也可以在本文檔中找到)的時候, 這很酷:)請注意,在第四個框架發(fā)布之前,這種注入方法存在很大的問題–方面要求使用默認構(gòu)造函數(shù)。 現(xiàn)在仍然存在基于構(gòu)造函數(shù)的注入的“缺點”:它不允許循環(huán)依賴。 我特意在雙引號中添加了缺點,因為對我來說,這是該機制的巨大優(yōu)勢:)文檔中還有另外一句話:

通常建議不要在您的bean之間使用循環(huán)引用。

但為什么? 如果我們的應(yīng)用程序中有循環(huán)引用,該怎么辦? 我不想寫有關(guān)應(yīng)用程序設(shè)計的文章,因為幾乎總是可以重構(gòu)我們的代碼并將有問題的邏輯委托給第三個bean。 有兩個重大而不幸的“沉默”問題。

第一個陷阱

調(diào)用ListableBeanFactory.getBeansOfType()方法時,不能確定將返回哪些Bean。 讓我們看一下DefaultListableBeanFactory類的代碼:

if (isCurrentlyInCreation(bce.getBeanName())) {if (this.logger.isDebugEnabled()) {this.logger.debug("Ignoring match to currently created bean '"+ beanName + "': " + ex.getMessage());}// ...continue; }

如您所見,如果您不使用DEBUG日志記錄級別,那么將有零個信息表明Spring在解析過程中跳過了特定的bean。 如果您想獲取所有事件處理程序,那就太麻煩了:)

第二陷阱

第二個問題涉及AOP。 如果要在bean上使用方面,請確保它不涉及循環(huán)引用-否則Spring將創(chuàng)建bean的兩個實例–一個沒有方面,另一個具有適當(dāng)方面。 當(dāng)然仍然沒有任何信息。 驚訝嗎

對我來說, 停止在我們的應(yīng)用程序中使用循環(huán)依賴就足夠了(特別是與此相關(guān)的行為可能更有趣)。

請勿使用循環(huán)依賴!

但是,我們該如何擺脫困境呢? 當(dāng)然,您可以使用基于構(gòu)造函數(shù)的注入:)但是,如果您擁有大量應(yīng)用程序,那么花很多時間重寫所有類以使用構(gòu)造函數(shù)而不是setter并不是最好的主意。 幸運的是,我有個好消息– AbstractRefreshableApplicationContext類中的allowCircularReferences字段。 只需添加一行到應(yīng)用程序上下文創(chuàng)建(所描述的方式在這個崗位 )

AnnotationConfigWebApplicationContext applicationContext =new AnnotationConfigWebApplicationContext(); applicationContext.setAllowCircularReferences(false); // rest of context initialization

最后,為了使您心情愉快,我從DefaultListableBeanFactory粘貼了另一個代碼片段:

catch (NoSuchBeanDefinitionException ex) {// Shouldn't happen - probably a result of circular reference resolution...if (logger.isDebugEnabled()) {logger.debug("Failed to check manually registered singleton with name '"+ beanName + "'", ex);} }

祝你今天愉快! :)

翻譯自: https://www.javacodegeeks.com/2015/01/dependency-injection-pitfalls-in-spring.html

spring依賴注入

總結(jié)

以上是生活随笔為你收集整理的spring依赖注入_Spring的依赖注入陷阱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。