現在spring中的bean來源主要有兩個:
一個是掃描資源文件xml/properties等加載BeanDefinition
二是掃描Annotation標註的Class文件加載BeanDefinition
不管是哪一種,我們都知道讀取資源文件加載到BeanFactory中的都是BeanDefinition(針對普通的Bean)
在我們需要使用的Bean的時候,再調用getBean方法獲取Bean。
如果是第一次的話會調用createBean方法,創建Bean的實例。如果是多次調用getBean的時候,會優先查找緩存裏面的實例
創建bean的過程在前面的幾節一起梳理過,現在我們來總結一下
首先是BeanDefinition階段:
1-需要mergeBeanDefinition
2-resovleBeanClass,把BeanDefinition中的beanClass從String轉化爲Class
3-調用postProcessBeforeInstantiation方法,攔截bean的實例化 (InstantiationAwareBeanPostProcessor)
4-使用反射,實例化bean
5-調用postProcessAfterInstantiation方法,攔截bean實例化(InstantiationAwareBeanPostProcessor)
6-調用postProcessProperties方法,攔截bean的屬性注入 (InstantiationAwareBeanPostProcessor)
7-調用applyPropertyValues,把bean的配置屬性注入到bean中
8-進入bean的初始化過程,invokeAwareMethod,調用bean自己實現的Aware方法
9-applyBeanPostProcessBeforeInitialization,攔截bean的初始化
10-invokeInitMethod,調用bean自己定義的初始化方法
11-applyBeanpostProcessAfterInitialization,攔截bean的初始化
這樣之後,整個createBean過程就完成了,這個時候獲取的bean,會放入beanFactory的緩存中,下次訪問會優先訪問緩存。