spring容器建立物件的時間和懶載入
阿新 • • 發佈:2019-01-02
我們如何判斷一個物件是在spring容器啟動的時候建立的呢 還是在我們呼叫這個物件的時候建立的?
在單例的情況下:
在上面一個spring基礎(一)中,我們寫了如下的測試類:
public class testHelloSpring { @Test public void test1(){ //啟動spring容器 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); //得到helloSpring物件 helloSpring helloSpring=(helloSpring) applicationContext.getBean("hello"); //呼叫相應的方法 helloSpring.hello(); } }
我們只需要在啟動spring容器的後面,輸出一句話,然後在對應的類中的預設建構函式也輸出一句話,看看它們誰先輸出即可:
public class testHelloSpring { @Test public void test1(){ //啟動spring容器 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); //在這裡輸出一句話,這裡剛剛好啟動了spring容器 System.out.println("invoke!!!!"); //得到helloSpring物件 helloSpring helloSpring=(helloSpring) applicationContext.getBean("hello"); //呼叫相應的方法 helloSpring.hello(); } }
執行結果:
aa
invoke!!!
hello Spring
我們可以看到,new instance在前面,invoke在後面,所以,spring預設建立物件是在啟動spring的時候。
這裡還有另外一種情況,就是在我們呼叫這個物件的時候,才新建物件。我們要在配置檔案中,對應類的屬性裡面新增一個屬性: lazy-init
該屬性的預設值為default。相當於false。
<bean class="cn.ansel.domain.helloSpring" id="hello" lazy-init="true"></bean>
再次執行結果:
invoke!!!
aa
hello Spring
我們可以看到,是先啟動了spring容器,然後就是我們呼叫該類的時候,spring容器才幫我們建立物件。那麼這兩種情況有什麼意義呢?
spring建立物件的時機的意義:
當我們使用ssh整合的時候,tomcat啟動時就建立配置檔案中的所有bean物件的,如果有某些類或者配置檔案的書寫有誤,這時候,spring容器就會報錯,那麼自然spring容器也就啟動不起來了。這種情況可以避免,我們到了後面真正要呼叫該類的時候才報錯。當然這種做法,會把一些類過早的載入到記憶體中。
當我們選擇在呼叫某個類的時候,spring容器才幫我們建立這個類,首先我們可以解決第一種情況出現的問題,節省了記憶體但是這時候,類和配置檔案中許多隱藏的錯誤,在呼叫的時候才發現,這時候添加了查錯的壓力。