[英]When does Spring create instances of objects that are injected
Spring做DI並創建對象,因此您的程序不必擔心創建對象。 但是這里的問題是何時創建注入對象的實例。 是在主程序使用實例時還是在創建主程序實例時。
當上下文啟動時,將實例化,注入和初始化上下文中的所有bean。 到從上下文中檢索到第一個bean時,所有bean都可以使用了。
有兩件事可以阻止在上下文啟動時初始化bean:
scope="xyz"
屬性配置為不同范圍 (例如, prototype
, request
或session
)的bean lazy-init="true"
,在這種情況下,只有在明確要求它時,或者是否需要將其作為其他bean的依賴項時,才會實例化它。 在評論中,OP寫道:
因此,由程序員決定是否需要延遲初始化bean或預先初始化bean。 這可能是非常主觀的,但是您能否讓我知道在這種情況下遵循的最佳實踐。
是的,由程序員(或系統集成商)決定。
確實沒有任何“最佳實踐”規則可以決定。 這樣想:
如果在總是需要實例化時聲明延遲初始化的bean,則可能會使啟動過程變慢。
如果在並非總是需要時聲明將其急切初始化的bean,則會使啟動過程變慢,並可能使用更多的內存。 在最壞的情況下,創建不必要的bean甚至可能導致啟動失敗。
簡而言之,您需要了解您的應用程序。
默認情況下,作為初始化過程的一部分,ApplicationContext實現會急於創建和配置所有單例bean。 通常,這種預初始化是可取的,因為與數小時甚至數天后相比,會立即發現配置或周圍環境中的錯誤。 如果不希望使用此行為,則可以通過將bean定義標記為延遲初始化來防止單例bean的預實例化。 延遲初始化的bean告訴IoC容器在首次請求時而不是在啟動時創建一個bean實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.