2012-03-16 103 views
1

我正在閱讀Pro Spring 2.5的書,我有一個關於依賴注入如何工作的問題。依賴注入是如何工作的?

我瞭解BeanFactory並執行依賴關係查找。現在我讀了關於依賴注入的內容,並且有一些問題。根據我的理解,您希望將查找限制在最低限度,例如查找引導應用程序的引導對象。然後,依賴注入將負責其餘部分。但我不明白這個作品。

假設你有一個beanfactory,你會得到一個啓動整個應用程序的MyApplication實例。剩下的對象使用依賴注入來獲得他們的合作者。 beanfactory維護它管理的bean的列表,但不是該工廠僅在應用程序的主要方法中可用?如果beanfactory也管理它們包含bean的範圍,我不明白這是如何完成的。 beanfactory在某種程度上是全球性的嗎?

回答

2

bean工廠實例化所有對象。它解析你的配置(xml或annotations),實例化你的bean並設置它們的依賴關係。然後,所有這些bean都存儲在應用程序上下文中。

您通常有一個入口點到您的應用程序 - 那裏你context.getBean(..)。現在bean已經注入了它的依賴關係,因爲它被bean工廠放到了上下文中。

經驗法則可能會清除一些事情:在使用DI框架時,您從不使用new運算符(使用bean類)。框架使得實例,而不是你。

+0

因此,「啓動」應用程序的bean現在有一個註冊表,它可以獲取注入其依賴關係並準備好使用的bean? – LuckyLuke 2012-03-16 12:47:03

+0

是的。在Web上下文中,例如上下文(註冊表)由偵聽器啓動,該偵聽器由Spring提供並且您沒有看到。 – Bozho 2012-03-16 12:58:12

2

所以,有兩種方法可以發生(截至春季3)。在「傳統」依賴注入中,bean工廠只能將依賴關係注入到自己創建的bean中。在這種情況下,當第一次創建bean時,bean工廠將解析並注入bean的所有依賴關係。

另一種方式要求您通過加載或編譯時編織來使用「完整」AspectJ。在這種情況下,您可以在spring-aspects.jar中使用一個方面,該方面基本上切入所有的new操作,允許您在任意創建的對象中獲得依賴注入。這是通過使用@Configurable註釋觸發的。您可以閱讀更多here

0

控制和依賴注入反轉的關鍵在於您(通常)不需要 beanfactory,除非讓您的應用程序啓動。你的依賴「自動出現」在你的對象中。這基本上適用於在應用程序的整個生命週期中很少(通常是一個)實例的對象。

E.g.如果你的MyApplication依賴於MyModuleA的一個實例,你可以簡單地使用@Autowired。當你在開始時從beanfactory獲取應用程序對象時,它已經帶有一個MyModuleA預置的實例。

關於範圍:這來自web上下文。除了只有一個實例的對象之外,您可以將對象作用於用戶的會話。在那裏你可以存儲你需要保留的幾個請求的信息,但爲不同的用戶分開,請考慮:購物車。

通常將bean工廠視爲全局。我認爲可能有多個實例,但它們會斷開連接,並且不能注入只有其他實例已知的對象。