Spring 容器從加載配置文件到創建出一個完整的Bean 的作業流程及參與的角色
Bean
(1),ResourceLoader 從存儲介質中加載Spring配置信息,并使用Resource表示這個配置文件資源
(2),BeanDefinitionReader 讀取 Resource 所指向的配置文件資源,然后結項配置文件。配置文件中的每個<Bean> 解析成一個 BeanDefinition 對象,并保存至 BeanDefinitionRegistry 中去
(3),容器掃描 BeanDefinitionRegistry 中的 BeanDefinition, 使用 Java 反射機制 識別出 Bean 后置處理器(實現BeanFactoryPostProcessor 接口的Bean),然后調用這些Bean工廠后處理器對BeanDefinitionRegistry 中的 BeanDefinition 進行加工處理,主要完成兩項工作:
- 對使用占位符的<Bean> 元素標簽進行解析工作,得到最終的配置值。這意味著對一些半成品的BeanDefinition 對象進行加工處理并得到成品的 BeanDefinition 對象
- 對 BeanDefinitionRegistry 中的BeanDefinition 進行掃描,通過 java 反射機制 找出所有屬性編輯器Bean(所有實現了PropertyEditor 接口的Bean),并將它們自動注冊到Spring 容器的屬性編輯器注冊表中(PropertyEditorRegistry)
(4),Spring 容器從BeanDefinitionRegistry 中取出加工后的BeanDefinition ,并調用 InstantiationStrategy 著手進行Bean 實例化的工作
(5),在實例化Bean 時,Spring 容器使用 BeanWrapper 對Bean 進行封裝,完成Bean 屬性的注入工作
(6),利用容器中注冊的Bean 后處理器(實現 BeanPostProcessor 接口的Bean)對已經完成屬性注入工作的 Bean 進行后續加工,直接裝配出一個準備就緒的 Bean