前言
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 方法有兩個邏輯:
- 將這幾個 Processor 注冊到 beanFactory;
- 處理器封裝為 BeanDefinitionHolder 對象。
BeanDefinitionHolder 就是封裝了下 BeanDefinition ,說明這個 BeanDefinition 的持有者 name 是誰。
大膽猜測
執行完這一行之后,在 AnnotationConfigApplicationContext 里面有了 這幾個 BeanDefinition。
小心求證
Debug 走起!
額…… 只有四個,假裝是對的。還是一步一步看一看吧!原來是沒有 JSR-250 和 JPA,那這個就正常了。
總結
其實簡而言之,這一步就是注冊了一些 Spring 自己的 PostProcessor。