前面提到過Bean的初始化方式,在Bean 的配置元資訊時候我們知道Bean的元資訊配置中有lazy-init 延遲初始化屬性配置,延遲初始化Spring Bean 還有Java 注解API的方式實作

案例分析
這裡已Java 注解方式案例講解描述
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
/**
* Whether lazy initialization should occur.
*/
boolean value() default true;
}
看到Lazy 注解有預設屬性配置true,非延遲加載;如果我們使用非延遲加載其實可以不用标注此注解,這裡友善代碼閱讀标注上
- 非延遲加載
運作結果 可以看出延遲加載在應用上下文啟動之後加載
- 延遲加載
運作結果 可以看出延遲加載在應用上下文啟動之前加載
分析
其中的差異可以檢視源碼分析在
applicationContext.refresh()
啟動應用上下文方法中可以看到一個方法
finishBeanFactoryInitialization(beanFactory);
這個方法的作用是完成Bean的初始化動作,看注釋
Instantiate all remaining (non-lazy-init) singletons.
它的意思就是:它會去初始化或者是執行個體化我們所有的非延遲初始化的一個單體類或者單體Bean
進入方法裡面又可以發現
// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);
這裡又進行補充,就是初始化我們剩餘的這些東西
換而言之在我們應用上下啟動的時候有一個前置動作,普通的Bean在這裡初始化 ,部分Bean是需要我們内部容器自己做初始化 。另一個動作就是延遲加載按需加載Bean
總結
其實延遲加載和非延遲加載在定義的時候,就是Bean注冊的時候是沒有差別按照你需要的時候進行注冊;但是在依賴查找和依賴注入的時候它的差別就展現出來了,一個是在應用上下文啟動之前,另一個在應用上下文啟動之後