1. 程式人生 > >spring容器建立物件的時間和懶載入

spring容器建立物件的時間和懶載入

我們如何判斷一個物件是在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容器才幫我們建立這個類,首先我們可以解決第一種情況出現的問題,節省了記憶體但是這時候,類和配置檔案中許多隱藏的錯誤,在呼叫的時候才發現,這時候添加了查錯的壓力。