javascript
spring依赖注入_Spring的依赖注入陷阱
spring依賴注入
Spring框架中有三種注入變量:
- 基于二傳手的注射
- 基于構造函數的注入
- 基于現場的注入
這些機制中的每一種都有優點和缺點,并且不僅只有一種正確的方法。 例如現場注入:
在生產代碼中使用它通常不是最好的主意,主要是因為它使我們的bean無法在不啟動Spring上下文或不使用反射hack的情況下進行測試。 另一方面,它幾乎不需要其他代碼,并且可以在集成測試中使用-絕對不會獨立實例化。 我認為這是基于現場注射的唯一情況。
現在,讓我們集中討論兩個主要變體。 在Spring文檔中,我們可以讀到
…將構造函數參數用于強制性依賴項并將設置器用于可選的依賴項是一個很好的經驗法則。
同樣在參考Spring到3.1的文檔中 ,我們可以找到一個句子
Spring團隊通常提倡setter注入,因為大量的構造函數參數可能變得笨拙,尤其是當屬性是可選的時。
這種情況在文檔中已更改為第四版,其中指出:
Spring團隊通常提倡構造函數注入,因為它使人們能夠將應用程序組件實現為不可變對象,并確保所需的依賴項不為null。
尤其是在版本4.0之前的人們使用基于構造函數的注入方法(其中也有些“純粹主義者”)(這也可以在本文檔中找到)的時候, 這很酷:)請注意,在第四個框架發布之前,這種注入方法存在很大的問題–方面要求使用默認構造函數。 現在仍然存在基于構造函數的注入的“缺點”:它不允許循環依賴。 我特意在雙引號中添加了缺點,因為對我來說,這是該機制的巨大優勢:)文檔中還有另外一句話:
通常建議不要在您的bean之間使用循環引用。
但為什么? 如果我們的應用程序中有循環引用,該怎么辦? 我不想寫有關應用程序設計的文章,因為幾乎總是可以重構我們的代碼并將有問題的邏輯委托給第三個bean。 有兩個重大而不幸的“沉默”問題。
第一個陷阱
調用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上使用方面,請確保它不涉及循環引用-否則Spring將創建bean的兩個實例–一個沒有方面,另一個具有適當方面。 當然仍然沒有任何信息。 驚訝嗎
對我來說, 停止在我們的應用程序中使用循環依賴就足夠了(特別是與此相關的行為可能更有趣)。
請勿使用循環依賴!
但是,我們該如何擺脫困境呢? 當然,您可以使用基于構造函數的注入:)但是,如果您擁有大量應用程序,那么花很多時間重寫所有類以使用構造函數而不是setter并不是最好的主意。 幸運的是,我有個好消息– AbstractRefreshableApplicationContext類中的allowCircularReferences字段。 只需添加一行到應用程序上下文創建(所描述的方式在這個崗位 )
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依賴注入
總結
以上是生活随笔為你收集整理的spring依赖注入_Spring的依赖注入陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hazelcast入门教程_Hazelc
- 下一篇: restful xml_使用入站适配器公