簡體   English   中英

Spring何時創建注入對象的實例

[英]When does Spring create instances of objects that are injected

Spring做DI並創建對象,因此您的程序不必擔心創建對象。 但是這里的問題是何時創建注入對象的實例。 是在主程序使用實例時還是在創建主程序實例時。

當上下文啟動時,將實例化,注入和初始化上下文中的所有bean。 到從上下文中檢索到第一個bean時,所有bean都可以使用了。

有兩件事可以阻止在上下文啟動時初始化bean:

  • Bean具有使用scope="xyz"屬性配置為不同范圍 (例如, prototyperequestsession )的bean
  • 一個bean被標記為lazy-init="true" ,在這種情況下,只有在明確要求它時,或者是否需要將其作為其他bean的依賴項時,才會實例化它。

在評論中,OP寫道:

因此,由程序員決定是否需要延遲初始化bean或預先初始化bean。 這可能是非常主觀的,但是您能否讓我知道在這種情況下遵循的最佳實踐。

是的,由程序員(或系統集成商)決定。

確實沒有任何“最佳實踐”規則可以決定。 這樣想:

  • 如果在總是需要實例化時聲明延遲初始化的bean,則可能會使啟動過程變慢。

  • 如果在並非總是需要時聲明將其急切初始化的bean,則會使啟動過程變慢,並可能使用更多的內存。 在最壞的情況下,創建不必要的bean甚至可能導致啟動失敗。

簡而言之,您需要了解您的應用程序。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

默認情況下,作為初始化過程的一部分,ApplicationContext實現會急於創建和配置所有單例bean。 通常,這種預初始化是可取的,因為與數小時甚至數天后相比,會立即發現配置或周​​圍環境中的錯誤。 如果不希望使用此行為,則可以通過將bean定義標記為延遲初始化來防止單例bean的預實例化。 延遲初始化的bean告訴IoC容器在首次請求時而不是在啟動時創建一個bean實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM