Spring 源碼學習 06:AnnotatedBeanDefinitionReader


前言

BeanDefinition 的概念也了解了,也知道一個 Bean 在 Spring 中定義的信息有哪些之后,繼續言歸正傳。

源碼分析

在初始化時會先生成一個 reader ,進入方法,其實是走的下面的邏輯:

其中 getOrCreateEnvironment(registry) 會返回一個 Environment 用來表示當前的運行環境之類的。

ConditionEvaluator 是用來完成對 @Conditional 這個條件注解的判斷。

這塊可以參考官網:Environment Abstraction 章節

Conditionally Include @Configuration Classes or @Bean Methods 章節

補充

BeanDefinitionRegistry:就是對 BeanDefinition 進行注冊、移除、獲取等操作的一個接口。
比如:registerBeanDefinition、removeBeanDefinition、containsBeanDefinition 看名字也能猜個大概意思。

registerAnnotationConfigProcessors

下面來看最后一行代碼:

AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);

這個代碼相對較長,還是以截圖代替。

對 beanFactory 添加依賴比較器 和 自動裝配解析器 后開始添加各種處理器。

添加處理器時,下面收縮的代碼和唯一展開的 ConfigurationClassPostProcessor 內部邏輯相同,都是調用 registerPostProcessor 方法,下面再介紹下這幾個處理器的作用:

  • ConfigurationClassPostProcessor 用於對 @Configuration 類進行引導處理。
  • AutowiredAnnotationBeanPostProcessor 處理 @Autowired @Value 和 JSR-330的@Inject 還有 @Lookup 注解
  • CommonAnnotationBeanPostProcessor 用來處理 @PostConstruct @PreDestroy @Resource。
  • PersistenceAnnotationBeanPostProcessor 當支持 JPA 時添加這個。
  • EventListenerMethodProcessor 支持 @EventListener。

registerPostProcessor

registerPostProcessor 方法有兩個邏輯:

  1. 將這幾個 Processor 注冊到 beanFactory;
  2. 處理器封裝為 BeanDefinitionHolder 對象。

BeanDefinitionHolder

BeanDefinitionHolder 就是封裝了下 BeanDefinition ,說明這個 BeanDefinition 的持有者 name 是誰。

大膽猜測

執行完這一行之后,在 AnnotationConfigApplicationContext 里面有了 這幾個 BeanDefinition。

小心求證

Debug 走起!

額…… 只有四個,假裝是對的。還是一步一步看一看吧!原來是沒有 JSR-250 和 JPA,那這個就正常了。

總結

其實簡而言之,這一步就是注冊了一些 Spring 自己的 PostProcessor。

相關推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM