首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring IoC 容器源碼深度解析:Bean 創建與初始化全流程

     編輯:Java 綜合教學

核心概念回顧

IoC(控制反轉):將物件創建與依賴管理權移交給容器,實現鬆耦合。容器負責查找、創建、注入依賴,應用程式僅被動接受。體現「好萊塢法則」——「別找我們,我們找你」。

源碼環境準備

<beans>
    <bean id="test" class="org.study.spring.ioc.Test"/>
</beans>
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
Test bean = ctx.getBean("test", Test.class);

啟動流程入口:AbstractApplicationContext.refresh()

關鍵步驟:

  1. obtainFreshBeanFactory() 建立 BeanFactory
  2. invokeBeanFactoryPostProcessors(beanFactory) 執行 BeanDefinition 後處理器(如 PropertyPlaceholderConfigurer、ConfigurationClassPostProcessor)
  3. registerBeanPostProcessors(beanFactory) 註冊 BeanPostProcessor
  4. finishBeanFactoryInitialization(beanFactory) 預實例化所有非延遲單例 Bean

BeanFactoryPostProcessor 執行鏈

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors() 按優先級分三批執行:

  1. 實作 PriorityOrdered 的 BeanDefinitionRegistryPostProcessor
  2. 實作 Ordered 的 BeanDefinitionRegistryPostProcessor
  3. 其餘 BeanDefinitionRegistryPostProcessor,以 while 迴圈直至無新增

隨後同樣優先級順序執行一般 BeanFactoryPostProcessor,最後清理元資料快取。

核心獲取流程:AbstractBeanFactory.doGetBean()

三階段策略:

  1. 單例快取檢查:singletonObjects、earlySingletonObjects、singletonFactories(解決循環依賴)
  2. 父工廠委派:雙親委派模式,類似類載入機制
  3. 實例化流程:合併 BeanDefinition → 驗證依賴(depends-on) → 根據 scope 創建(單例用 getSingleton() 雙重檢查鎖,原型直接 createBean())

Bean 實例化:AbstractAutowireCapableBeanFactory.createBean()

四階段:

  1. 解析並驗證 Bean Class
  2. 準備方法覆寫(lookup-method、replaced-method)
  3. 早期暴露代理:resolveBeforeInstantiation() 讓 BeanPostProcessor 有機會返回代理物件(如 AOP)
  4. 委派 doCreateBean() 完成實際創建與初始化

實例化策略:createBeanInstance() → instantiateBean()

按優先級選擇:

  1. 工廠方法(factory-method)
  2. 建構器自動裝配(autowire=constructor 或有 constructor-arg)
  3. 預設無參建構器(SimpleInstantiationStrategy 使用反射 clazz.getDeclaredConstructor())

若有 @Lookup 或 @Replace,會動態生成 CGLIB 子類。

屬性填充:populateBean()

處理 @Autowired、@Value、XML property 等,支援類型轉換、集合合併、延遲注入等。

初始化流程:initializeBean()

  1. Aware 接口回調:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 等
  2. 前置後處理:BeanPostProcessor.postProcessBeforeInitialization()
  3. 自定義初始化:
    • 實作 InitializingBean.afterPropertiesSet()
    • XML init-method 指定的方法
  4. 後置後處理:BeanPostProcessor.postProcessAfterInitialization()(AOP 代理在此生成)

銷毀註冊

registerDisposableBeanIfNecessary() 針對單例註冊銷毀回調(DisposableBean.destroy() 或 destroy-method),容器關閉時執行。

總結圖譜

getBean()
 └─ doGetBean()
     ├─ 緩存檢查 / 父工廠委派
     └─ createBean()
         ├─ resolveBeforeInstantiation() → BeanPostProcessor 早期代理
         └─ doCreateBean()
             ├─ createBeanInstance() → 反射/CGLIB/工廠方法
             ├─ populateBean() → 依賴注入
             ├─ initializeBean()
             │   ├─ invokeAwareMethods()
             │   ├─ applyBeanPostProcessorsBeforeInitialization()
             │   ├─ invokeInitMethods() → afterPropertiesSet / init-method
             │   └─ applyBeanPostProcessorsAfterInitialization() → AOP 代理
             └─ registerDisposableBeanIfNecessary()

掌握此流程可精準定位 Bean 生命週期問題,並理解 Spring 如何實現鬆耦合與擴展點開放。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved