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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring源码 — 一、IoC容器初始化

發(fā)布時間:2025/5/22 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring源码 — 一、IoC容器初始化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

IoC容器初始化

注意:本次的spring源碼是基于3.1.1.release版本

容器:具有獲取Bean功能——這是最基本功能,也是BeanFactory接口定義的主要行為,在添加了對于資源的支持之后就是ApplicationContext。對于容器的理解可以是:

  • 在一個HashMap中存放著很多bean
  • 可以解析依賴并初始化bean

所以IoC初始化主要完成以下任務(wù):

  • 定位資源,也就是配置bean的xml
  • 加載資源,將xml中配置的bean解析為BeanDefinition
  • 注冊bean,將BeanDefinition添加到一個ConcurrentHashMap中
  • 以ClassPathXmlApplicationContext的初始化為例說明初始化過程
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

    ClassPathXmlApplicationContext

    從這個類的構(gòu)造函數(shù)開始

    1.super(parent);

    調(diào)用超類AbstractApplicationContext的的構(gòu)造方法,因為這個就是root容器,所以parent是null

    • 初始化patternResolver-PathMatchingResourcePatternResolver,按照path解析資源位置
    • 初始化StandardEnvironment(非web環(huán)境),提供一些property配置

    2.setConfigLocations

    • 解析xml的路徑,有可能包含多個配置文件,比如:/WEB-INF/*-context.xml

    3. refresh

    調(diào)用的是超類AbstractApplicationContext的refresh方法

    AbstractApplicationContext

    這個類是ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等容器的超類,這些類的初始化都會調(diào)用到超類的refresh方法,refresh主要進(jìn)行以下操作:

    • prepareRefresh:解析xml文件中的placeholder,替換為指定值(由子類重寫)
    • obtainBeanFactory
      • 新建一個beanFactory:DefaultListableBeanFactory
      • loadBeanDefinition
        • 構(gòu)造XmlBeanDefinitionReader,設(shè)置resourceLoader和Environment
    • prepareBeanFactory:設(shè)置beanFactory上下文
    • invokeBeanFactoryPostProcessors:調(diào)用實(shí)現(xiàn)了BeanFactoryPostProcessor的類
    • registerBeanPostProcessors:注冊bean初始化時候的processor,包括bean init before和after
    • initMessageSource
    • initApplicationEventMulticaster
    • onRefresh:初始化子容器
    • registerListeners:注冊實(shí)現(xiàn)了ApplicationListener的listener
    • finishBeanFactoryInitialization:初始化配置為lazy-init=false的bean
    • finishRefresh:觸發(fā)所有堅挺ContextRefreshedEvent事件的listener

    接下來主要關(guān)注obtainBeanFactory,因為容器的創(chuàng)建和初始化就在這個方法中,調(diào)用時序如下:

    在AbstractRefreshableApplicationContext.refreshBeanFactory中創(chuàng)建了DefaultListableBeanFactory,并開始加載BeanDefinition,load過程如下:

    • 調(diào)用了AbstractXmlApplicationContext.loadBeanDefinitions
      • 新建XmlBeanDefinitionReader
      • 調(diào)用XmlBeanDefinitionReader.loadBeanDefinitions,主要的load工作在這個類(會使用到父類中的一些方法)中進(jìn)行

    XmlBeanDefinitionReader

    AbstractBeanDefinitionReader(XmlBeanDefinitionReader父類)

    這個類中主要對資源進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換為Document之后交給DefaultBeanDefinitionDocumentReader
    循環(huán)取出所有配置,針對每個配置進(jìn)行l(wèi)oad
    每個配置的資源轉(zhuǎn)換如下:
    location->resource->encodeResource->inputStream->document

    DefaultBeanDefinitionDocumentReader

    • 解析document為BeanDefinition并注冊
    • 調(diào)用容器的DefaultListableBeanFactory.registerBeanDefinition將BeanDefinition注冊到beanDefinitionsMap

    轉(zhuǎn)載于:https://www.cnblogs.com/sunshine-2015/p/5982714.html

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的spring源码 — 一、IoC容器初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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