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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基于Xml 的IOC 容器-开始启动

發布時間:2024/4/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Xml 的IOC 容器-开始启动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SpringIOC 容器對Bean 配置資源的載入是從refresh()函數開始的,refresh()是一個模板方法,規定了IOC 容器的啟動流程, 有些邏輯要交給其子類去實現。它對Bean 配置資源進行載入ClassPathXmlApplicationContext 通過調用其父類AbstractApplicationContext 的refresh()函數啟
動整個IOC 容器對Bean 定義的載入過程,現在我們來詳細看看refresh()中的邏輯處理:

@Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.//1、調用容器準備刷新的方法,獲取容器的當時時間,同時給容器設置同步標識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、調用所有注冊的BeanFactoryPostProcessor的BeaninvokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.//6、為BeanFactory注冊BeanPost事件處理器.//BeanPostProcessor是Bean后置處理器,用于監聽容器觸發的事件registerBeanPostProcessors(beanFactory);// Initialize message source for this context.//7、初始化信息源,和國際化相關.initMessageSource();// Initialize event multicaster for this context.//8、初始化容器事件傳播器.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.//9、調用子類的某些特殊Bean初始化方法onRefresh();// Check for listener beans and register them.//10、為事件傳播器注冊事件監聽器.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.//11、初始化所有剩余的單例BeanfinishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.//12、初始化容器的生命周期事件處理器,并發布容器的生命周期事件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、銷毀已創建的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、重設公共緩存resetCommonCaches();}} }

refresh()方法主要為IOC 容器Bean 的生命周期管理提供條件,Spring IOC 容器載入Bean 配置信息從其子類容器的refreshBeanFactory() 方法啟動, 所以整個refresh() 中“ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();”這句以后代碼的都是注冊容器的信息源和生命周期事件,我們前面說的載入就是從這句代碼開始啟動。

refresh()方法的主要作用是:在創建IOC 容器前,如果已經有容器存在,則需要把已有的容器銷毀和關閉,以保證在refresh 之后使用的是新建立起來的IOC 容器。它類似于對IOC 容器的重啟,在新建立好的容器中對容器進行初始化,對Bean 配置資源進行載入。

?

總結

以上是生活随笔為你收集整理的基于Xml 的IOC 容器-开始启动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。