在默認情況下,ApplicationContext在初始化過程中可以輕易創建並配置所有的singleton beans。這些 pre-instantiation都很令人滿意,因爲這樣子很容易發現配置或者是環境的錯誤,
而不是幾個小時甚至幾天後才發現這些錯誤。當這些行爲不適合我們的時候,我們可以通過定義bean爲延遲初始化阻止 singleton
bean 的 pre-instantiated 。一個延遲加載的bean會告訴Ioc容器,第一次使用它的時候創建bean,而不是在啓動的時候創建。
在XML文件中,這些行爲是通過 <bean/>節點裏面的 lazy-init屬性控制;例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.foo.AnotherBean"/>
ApplicationContext 消耗完之前的配置,當 ApplicationContext 啓動時不會馬上 pre-instantiated 那些定義爲 lazy
的 bean,相反,ApplicationContext 啓動時會馬上 pre-instantiated 那些定義爲 not.lazy 的
bean。
然而,如果一個延遲加載的 bean 是另一個 singleton bean 的依賴,這個 bean
就不會延遲加載,ApplicationContext 會在啓動的時候創建這個 bean。因爲這個bean必須滿足 singleton bean 的依賴性。延遲加載的 bean注入到一個 singleton
bean 在其他地方不會延遲加載。
你也可以通過使用<beans/>節點裏面的default-lazy-init變量在容器水平上控制延遲加載。例如:
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>