最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring IoC容器的初始化過程

 更新時(shí)間:2025年08月18日 11:56:42   作者:dj_master  
Spring IoC容器初始化分兩階段:加載配置生成BeanDefinition,處理PostProcessor修改定義,注冊PostProcessor增強(qiáng)初始化,實(shí)例化單例Bean并注入依賴,核心類包含BeanDefinition、BeanFactory、ApplicationContext,refresh()方法主導(dǎo)整個(gè)流程,實(shí)現(xiàn)依賴注入和AOP

Spring IoC(Inversion of Control,控制反轉(zhuǎn))容器的初始化是 Spring 框架啟動的核心過程,它負(fù)責(zé)創(chuàng)建和管理 Bean,以及處理 Bean 之間的依賴關(guān)系。

以下是 Spring IoC 容器初始化的詳細(xì)流程,結(jié)合 源碼關(guān)鍵類核心步驟 拆解:

一、核心流程概覽

Spring IoC 容器初始化分為 2 大階段

  1. 容器啟動準(zhǔn)備:加載配置(XML/注解),解析成 BeanDefinition
  2. Bean 實(shí)例化與依賴注入:根據(jù) BeanDefinition 創(chuàng)建 Bean,處理依賴、初始化。

二、詳細(xì)步驟(以ClassPathXmlApplicationContext為例)

1.容器啟動(構(gòu)造方法調(diào)用)

// 示例:創(chuàng)建 Xml 應(yīng)用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

關(guān)鍵動作

  • 調(diào)用父類構(gòu)造方法,初始化 資源加載器ResourceLoader)和 ** Bean 工廠**(DefaultListableBeanFactory)。
  • 記錄配置文件路徑(如 applicationContext.xml)。

2.加載配置文件(refresh()方法觸發(fā))

refresh() 是容器初始化的核心方法,定義在 AbstractApplicationContext 中,包含 13 個(gè)關(guān)鍵步驟(簡化版流程):

public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // 1. 準(zhǔn)備刷新:記錄啟動時(shí)間、標(biāo)記活躍狀態(tài)、初始化屬性源
        prepareRefresh();
        
        // 2. 創(chuàng)建 Bean 工廠(若未創(chuàng)建),并加載 BeanDefinition
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
        
        // 3. 準(zhǔn)備 Bean 工廠:設(shè)置類加載器、后置處理器等
        prepareBeanFactory(beanFactory);
        
        try {
            // 4. 子類擴(kuò)展:允許子類修改 Bean 工廠(Spring Boot 常用)
            postProcessBeanFactory(beanFactory);
            
            // 5. 執(zhí)行 BeanFactoryPostProcessor:修改 BeanDefinition(如 PropertyPlaceholderConfigurer)
            invokeBeanFactoryPostProcessors(beanFactory);
            
            // 6. 注冊 BeanPostProcessor:用于 Bean 初始化前后增強(qiáng)(如 AutowiredAnnotationBeanPostProcessor)
            registerBeanPostProcessors(beanFactory);
            
            // 7. 初始化 MessageSource:國際化支持
            initMessageSource();
            
            // 8. 初始化 EventMulticaster:事件廣播器
            initApplicationEventMulticaster();
            
            // 9. 子類擴(kuò)展:初始化特殊 Bean(如 Spring MVC 的 DispatcherServlet)
            onRefresh();
            
            // 10. 注冊事件監(jiān)聽器
            registerListeners();
            
            // 11. 實(shí)例化所有非延遲加載的單例 Bean
            finishBeanFactoryInitialization(beanFactory);
            
            // 12. 完成刷新:發(fā)布 ContextRefreshedEvent
            finishRefresh();
        } catch (BeansException ex) {
            // 13. 異常處理:銷毀已創(chuàng)建的 Bean
            destroyBeans();
            cancelRefresh(ex);
            throw ex;
        }
    }
}

3.關(guān)鍵步驟拆解

(1)加載BeanDefinition(步驟 2:obtainFreshBeanFactory)

作用

  • 解析配置文件(XML/注解),生成 BeanDefinition(包含 Bean 類名、作用域、依賴等信息)。

實(shí)現(xiàn)

  • XML 配置:XmlBeanDefinitionReader 解析 <bean> 標(biāo)簽,生成 BeanDefinition
  • 注解配置:ClassPathBeanDefinitionScanner 掃描 @Component、@Service 等注解,生成 BeanDefinition。

示例

  • XML 中的 <bean id="userService" class="com.example.UserService"/> 會被解析為 BeanDefinition,記錄 userService 的類名、作用域(默認(rèn)單例)等。

(2)處理BeanFactoryPostProcessor(步驟 5:invokeBeanFactoryPostProcessors)

作用

  • 修改 BeanDefinition(在 Bean 實(shí)例化前)。

典型實(shí)現(xiàn)

  • PropertyPlaceholderConfigurer:替換 BeanDefinition 中的占位符(如 ${jdbc.url} → 實(shí)際配置值)。
  • ConfigurationClassPostProcessor:處理 @Configuration 類,解析 @Bean 方法。

示例

  • 配置文件中 <bean id="dataSource" url="${jdbc.url}"/>PropertyPlaceholderConfigurer 會將 ${jdbc.url} 替換為 application.properties 中的實(shí)際值。

(3)注冊BeanPostProcessor(步驟 6:registerBeanPostProcessors)

作用

  • 注冊用于 Bean 初始化前后增強(qiáng)的處理器(如 AutowiredAnnotationBeanPostProcessor 處理 @Autowired)。

典型實(shí)現(xiàn)

  • AutowiredAnnotationBeanPostProcessor:解析 @Autowired 注解,實(shí)現(xiàn)依賴注入。
  • AnnotationAwareAspectJAutoProxyCreator:實(shí)現(xiàn) AOP 代理,處理 @Aspect 切面。

(4)實(shí)例化單例Bean(步驟 11:finishBeanFactoryInitialization)

作用

  • 創(chuàng)建所有非延遲加載的單例 Bean(默認(rèn) lazy-init="false")。

實(shí)現(xiàn)

  • 遍歷 BeanDefinition,調(diào)用 getBean(beanName) 創(chuàng)建 Bean。
  • 處理依賴注入(populateBean)、初始化(initializeBean)。

關(guān)鍵方法

// AbstractBeanFactory.java
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, 
                          @Nullable Object[] args, boolean typeCheckOnly) 
                          throws BeansException {
    // 1. 檢查緩存:單例 Bean 先從緩存(singletonObjects)獲取
    Object sharedInstance = getSingleton(beanName);
    if (sharedInstance != null) {
        return (T) sharedInstance;
    }
    // 2. 創(chuàng)建 Bean 實(shí)例:調(diào)用構(gòu)造器/工廠方法
    BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
    // 3. 依賴注入:填充屬性(@Autowired、<property>)
    populateBean(beanName, mbd, instanceWrapper);
    // 4. 初始化:調(diào)用 @PostConstruct、init-method
    exposedObject = initializeBean(beanName, exposedObject, mbd);
    // 5. 放入緩存(單例 Bean)
    addSingleton(beanName, exposedObject);
    return (T) exposedObject;
}

(5)發(fā)布ContextRefreshedEvent(步驟 12:finishRefresh)

作用

  • 通知容器已完成初始化,觸發(fā) ApplicationListener 處理。

示例

  • Spring MVC 的 DispatcherServlet 會監(jiān)聽此事件,完成自身初始化(如加載 HandlerMapping)。

三、核心類與職責(zé)

類名職責(zé)
BeanDefinition存儲 Bean 的元數(shù)據(jù)(類名、作用域、依賴等)
BeanFactory基礎(chǔ) IoC 容器接口,定義 Bean 的創(chuàng)建、查找方法
ApplicationContext高級 IoC 容器接口(繼承 BeanFactory),支持 AOP、事件、國際化等
AbstractApplicationContext實(shí)現(xiàn) ApplicationContext 核心邏輯(如 refresh() 方法)
DefaultListableBeanFactory默認(rèn) Bean 工廠,存儲 BeanDefinition,創(chuàng)建 Bean 實(shí)例
BeanPostProcessorBean 初始化前后增強(qiáng)(如 AutowiredAnnotationBeanPostProcessor)
BeanFactoryPostProcessorBean 實(shí)例化前修改 BeanDefinition(如 PropertyPlaceholderConfigurer)

四、總結(jié)

Spring IoC 容器初始化的核心是 refresh() 方法,通過以下步驟完成:

  1. 加載配置 → 解析為 BeanDefinition;
  2. 處理 BeanFactoryPostProcessor → 修改 BeanDefinition;
  3. 注冊 BeanPostProcessor → 增強(qiáng) Bean 初始化;
  4. 實(shí)例化單例 Bean → 處理依賴注入、初始化;
  5. 發(fā)布事件 → 通知容器就緒。

理解這一過程,能清晰掌握 Spring 如何管理 Bean 的生命周期,以及 AOP、依賴注入的實(shí)現(xiàn)時(shí)機(jī)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(32)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(32)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • 詳解Java中Iterable與Iterator用法

    詳解Java中Iterable與Iterator用法

    在本文中小編給大家分享了關(guān)于Java中Iterable與Iterator的用法知識點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2018-10-10
  • SpringBoot使用Apache?Tika檢測敏感信息

    SpringBoot使用Apache?Tika檢測敏感信息

    Apache?Tika?是一個(gè)功能強(qiáng)大的內(nèi)容分析工具,它能夠從多種文件格式中提取文本、元數(shù)據(jù)以及其他結(jié)構(gòu)化信息,下面我們來看看如何使用Apache?Tika檢測敏感信息從而實(shí)現(xiàn)數(shù)據(jù)泄露防護(hù)吧
    2025-01-01
  • Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解

    Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)疫情防控管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實(shí)現(xiàn)解析

    Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實(shí)現(xiàn)解析

    這篇文章主要介紹了Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 淺談java String不可變的好處

    淺談java String不可變的好處

    這篇文章主要介紹了java String不可變的好處,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java StampedLock實(shí)現(xiàn)原理與最佳實(shí)踐記錄

    Java StampedLock實(shí)現(xiàn)原理與最佳實(shí)踐記錄

    本文介紹了Java 8引入的StampedLock,這是一種多模式同步控制組件,通過“戳”(stamp)標(biāo)識鎖的狀態(tài),支持寫鎖、悲觀讀鎖和樂觀讀三種模式,StampedLock在特定場景下能夠大幅提升系統(tǒng)性能,特別是在讀多寫少的場景中,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java導(dǎo)出生成csv文件的方法

    java導(dǎo)出生成csv文件的方法

    這篇文章主要為大家詳細(xì)介紹了java導(dǎo)出生成csv文件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Spring中allowedOriginPatterns和allowedOrigins方法有何不同詳解

    Spring中allowedOriginPatterns和allowedOrigins方法有何不同詳解

    這篇文章主要給大家介紹了關(guān)于Spring中allowedOriginPatterns和allowedOrigins方法有何不同,allowedOriginPatterns和allowedOrigins都是用來設(shè)置允許跨域請求的來源,需要的朋友可以參考下
    2023-10-10
  • Idea工具中創(chuàng)建 SpringBoot工程及入門詳解

    Idea工具中創(chuàng)建 SpringBoot工程及入門詳解

    這篇文章主要介紹了Idea工具中創(chuàng)建 SpringBoot工程及入門分析詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評論

福贡县| 宁夏| 甘孜县| 宽甸| 大方县| 都兰县| 萝北县| 交城县| 浠水县| 新安县| 岳阳县| 定远县| 安平县| 花莲市| 康马县| 北碚区| 余江县| 大石桥市| 丰城市| 洪洞县| 毕节市| 建平县| 县级市| 郑州市| 河津市| 盱眙县| 永川市| 紫阳县| 瓦房店市| 涟源市| 达州市| 巴青县| 青浦区| 铜川市| 游戏| 肥东县| 航空| 南木林县| 永登县| 元谋县| 大竹县|