轉載:
http://blog.csdn.net/lifeshow/archive/2006/11/16/1388209.aspx 看看這個討論 :
http://www.javaeye.com/post/325403
懶執行個體化
beanApplicationContext的預設行為是在啟動的時候,儘可能早的預執行個體化所有的單例bean。所謂“預執行個體化”是指ApplicationContext執行個體會在自身的初始化過程中,儘可能的建立和配置所有的單例bean,預執行個體化階段只是簡單列舉所用單態(預設狀態)Bean,給每個包含依賴注入的Bean建立執行個體,並緩衝該執行個體。通常這是正確的,因為這意味著在配置中,或者在相關輔助環境中的錯誤會被立刻發現(相比可能會在數小時甚至數天才被發現而言)。然後,有時這種預設的行為卻不是我們所需要的。當你不需要ApplicationContext預執行個體化單例bean時,你可以(在bean定義檔案的基礎上)有選擇地控制這種預設行為,將bean設定為懶執行個體化(lazy-initialized)。懶執行個體化bean告訴容器執行個體在啟動時建立,還是當被請求的時候才建立。例如:我們這個項目就是採用預執行個體化Bean,從控制台可以看到Tomcat在載入Bean定義檔時,就執行個體化了Bean(通過建構函式),如CustomBaseFormController,LoginController等。通過XML配置bean時,是通過'lazy-init'屬性來控制“懶載入”(lazy-loading)的。參看下面的例子:
<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>
對於上面的配置,叫做’lazy’的bean在ApplicationContext初始化時不會被預執行個體化,而叫做’not.lazy’的bean則會被儘早的預執行個體化。關於懶執行個體化,需要說明的一點是,即使bean被配置成懶執行個體化,假如該bean是一個非懶執行個體化的bean的依賴,那麼在ApplicationContext預執行個體化bean的時候,會建立它的所有依賴,即使它們中存在懶執行個體化的bean!所以,當容器把你配置成懶執行個體化的bean執行個體化的時候,不必疑惑;那是因為,這個懶執行個體化的bean是被依賴注射到了你的配置中其他某個地方的非懶執行個體化的單例bean。在容器層次,還可以通過使用<beans/>元素的'default-lazy-init'屬性實現懶執行個體化;參看下面的例子:
<beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>