首先,Spring默認是提前加載,這意味着當項目啟動,spring初始化,spring會把所有的掃描包下的 ,所有帶spring 注解(@Component、@Repository、@Service、@Controller)的類都初始化。
注意:當初始化時,會調用默認構造方法,即一個空的構造方法,但當在類中加入非空構造方法,spring會報錯誤,顯示找不到合適的構造方法。
當spring創建bean時,設置default-lazy-init="true",即懶加載時,spring不會主動初始化帶注解的類。
這里有幾個特殊情況值得注意:
1、由於在controller中會注入service層的類,由於,controller層面上的spring-mvc不是懶加載,即當在controller中注入service時,就會初始化此service類。因此即調用到誰初始化誰。
2、如果一個bean被設置為延遲初始化,而另一個非延遲初始化的singleton bean依賴於它,那么當ApplicationContext提前實例化singleton bean時,它必須也確保所有上述singleton 依賴bean也被預先初始化,當然也包括設置為延遲實例化的bean,即被非懶加載的bean依賴時也會被初始化。
提前加載的一個好處是能即刻發現錯誤:
ApplicationContext實現的默認行為就是在啟動時將所有singleton bean提前進行實例化。提前實例化意味着作為初始化過程的一部分,ApplicationContext實例會創建並配置所有的singleton bean。通常情況下這是件好事,因為這樣在配置中的任何錯誤就會即刻被發現(否則的話可能要花幾個小時甚至幾天)。
懶加載與提前加載對比:
懶加載:對象使用的時候才去創建。節省資源,但是不利於提前發現錯誤;
提前加載:容器啟動時立馬創建。消耗資源,但有利於提前發現錯誤。
