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

Spring 3.2 Bean 定義源碼解析:基於 Annotation 與 Java Config 兩大配置方式深度剖析

     編輯:Java 相關知識

一、基於 Annotation 配置 Bean Definition 解析流程

1. 入口:NamespaceHandler 機制

XML 中 <context:component-scan base-package="..."/> 觸發 ContextNamespaceHandler,其 init() 註冊 ComponentScanBeanDefinitionParser。

2. ComponentScanBeanDefinitionParser 核心步驟

  1. 建立 ClassPathBeanDefinitionScanner(繼承 ClassPathScanningCandidateComponentProvider)。
  2. 註冊預設過濾器:@Component、@ManagedBean、@Named 及其衍生註解。
  3. 解析 base-package,構造掃描模式 classpath*:com/pkg/**/*.class。
  4. 使用 ASM 讀取類別字節碼,提取註解元資料封裝為 AnnotationMetadata。
  5. 依 includeFilters/excludeFilters 篩選候選類別。
  6. 為每個候選建立 ScannedGenericBeanDefinition(含 AnnotationMetadata),設定 beanClass、resource、source 等屬性。
  7. 後處理:套用 BeanDefinitionDefaults、解析 @Lazy、@Primary、@DependsOn、@Role 等註解屬性。
  8. 註冊至 BeanDefinitionRegistry,發送 ReaderEventListener 事件。

3. 自動註冊通用後處理器

掃描結束時自動註冊:ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor。

二、基於 Java Config(@Configuration + @Bean)配置解析流程

1. 觸發時機

不同於 XML/Annotation 的預先解析,Java Config 由 ConfigurationClassPostProcessor(實作 BeanDefinitionRegistryPostProcessor)在 所有 BeanDefinition 已載入註冊表後、實例化前 介入處理。

2. 兩階段解析架構

  1. ConfigurationClassParser:掃描註冊表中被 @Component 或 @Configuration 標註的 BeanDefinition,解析其 @Bean 方法,封裝為 BeanMethod,建立類別層級的 ConfigurationClass 模型。
  2. ConfigurationClassBeanDefinitionReader:遍歷 ConfigurationClass,將每個 BeanMethod 轉換為 ConfigurationClassBeanDefinition(繼承 RootBeanDefinition,含 AnnotationMetadata),設定 factoryMethodName、initMethodName、destroyMethodName、autowireMode 等,並註冊至 Registry。

3. 關鍵差異

配置方式BeanDefinition 具體類型解析時機
XMLGenericBeanDefinition容器啟動初期,預先解析
AnnotationScannedGenericBeanDefinition容器啟動初期,預先解析
Java ConfigConfigurationClassBeanDefinitionBeanDefinitionRegistryPostProcessor 階段,延後解析

三、三種配置方式優劣比較

維度XMLAnnotationJava Config
集中管理✓ 集中✗ 分散✓ 集中於 @Configuration 類
修改重編譯✗ 不需✓ 需✓ 需
型別安全✗△✓ 編譯期檢查
重構友善✗△✓ IDE 重構支援
表達力基本基本完整 Java 語言能力

結語

Spring 3.2 透過 NamespaceHandler/BeanDefinitionParser 處理 XML 與 Annotation,透過 BeanDefinitionRegistryPostProcessor 機制優雅地引入 Java Config 延後解析模式,三者共存互補,開發團隊可根據專案規模、團隊習慣與維護策略選擇適配組合。

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