日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

延时加载refresh()方法

發(fā)布時間:2024/4/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 延时加载refresh()方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先從IOC 容器的初始化過程開始,我們知道IOC 容器讀入已經(jīng)定位的Bean 定義資源是從refresh()方法開始的,我們首先從AbstractApplicationContext 類的refresh()方法入手分析,源碼如下:

@Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.//1、調(diào)用容器準備刷新的方法,獲取容器的當時時間,同時給容器設(shè)置同步標識prepareRefresh();// Tell the subclass to refresh the internal bean factory.//2、告訴子類啟動refreshBeanFactory()方法,Bean定義資源文件的載入從//子類的refreshBeanFactory()方法啟動ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.//3、為BeanFactory配置容器特性,例如類加載器、事件處理器等prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.//4、為容器的某些子類指定特殊的BeanPost事件處理器postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.//5、調(diào)用所有注冊的BeanFactoryPostProcessor的BeaninvokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.//6、為BeanFactory注冊BeanPost事件處理器.//BeanPostProcessor是Bean后置處理器,用于監(jiān)聽容器觸發(fā)的事件registerBeanPostProcessors(beanFactory);// Initialize message source for this context.//7、初始化信息源,和國際化相關(guān).initMessageSource();// Initialize event multicaster for this context.//8、初始化容器事件傳播器.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.//9、調(diào)用子類的某些特殊Bean初始化方法onRefresh();// Check for listener beans and register them.//10、為事件傳播器注冊事件監(jiān)聽器.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.//11、初始化所有剩余的單例BeanfinishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.//12、初始化容器的生命周期事件處理器,并發(fā)布容器的生命周期事件finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.//13、銷毀已創(chuàng)建的BeandestroyBeans();// Reset 'active' flag.//14、取消refresh操作,重置容器的同步標識。cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...//15、重設(shè)公共緩存resetCommonCaches();}} }

在refresh()方法中ConfigurableListableBeanFactorybeanFactory = obtainFreshBeanFactory();啟動了Bean 定義資源的載入、注冊過程,而finishBeanFactoryInitialization 方法是對注冊后的Bean定義中的預實例化(lazy-init=false,Spring 默認就是預實例化,即為true)的Bean 進行處理的地方。

?

?

總結(jié)

以上是生活随笔為你收集整理的延时加载refresh()方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。