ApplicationContext實作的預設行為就是在啟動時将所有singleton bean提前進行執行個體化。提前執行個體化意味着作為初始化過程的一部分,ApplicationContext執行個體會建立并配置所有的singleton bean。通常情況下這是件好事,因為這樣在配置中的任何錯誤就會即刻被發現(否則的話可能要花幾個小時甚至幾天)。
有時候這種預設處理可能并不是你想要的。如果你不想讓一個singleton bean在ApplicationContext實作在初始化時被提前執行個體化,那麼可以将bean設定為延遲執行個體化。一個延遲初始化bean将告訴IoC 容器是在啟動時還是在第一次被用到時執行個體化。
在XML配置檔案中,延遲初始化将通過<bean/>元素中的lazy-init屬性來進行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean"lazy-init="true"><!-- various properties here... --></bean> <bean name="not.lazy" class="com.foo.AnotherBean"><!-- various properties here... --></bean>
當ApplicationContext實作加載上述配置時,設定為lazy的bean将不會在ApplicationContext啟動時提前被執行個體化,而not.lazy卻會被提前執行個體化。
需要說明的是,如果一個bean被設定為延遲初始化,而另一個非延遲初始化的singleton bean依賴于它,那麼當ApplicationContext提前執行個體化singleton bean時,它必須也確定所有上述singleton 依賴bean也被預先初始化,當然也包括設定為延遲執行個體化的bean。是以,如果Ioc容器在啟動的時候建立了那些設定為延遲執行個體化的bean的執行個體,你也不要覺得奇怪,因為那些延遲初始化的bean可能在配置的某個地方被注入到了一個非延遲初始化singleton bean裡面。
在容器層次中通過在<beans/>元素上使用'default-lazy-init'屬性來控制延遲初始化也是可能的。如下面的配置:
<beansdefault-lazy-init="true"><!-- no beans will be eagerly pre-instantiated... --></beans>