bean的生命周期把它總結為以下幾個階段
- 實例化
- 屬性注入/依賴注入
- 初始化
- 銷毀
其中實例化、屬性注入、初始化屬於bean創建的過程。
bean創建的過程流程圖


(1)當spring容器在啟動的時候或者啟動完成后顯示調用getBean方法時來獲取bean實例的時候,都會調用這個doGetBean方法
- doGetBean方法首先通過調用getSingleton判斷這個bean能不能拿到,如果可以直接返回;
- doGetBean會根據不同的作用域,執行不同的操作
(2)Bean的創建,主要是通過調用doCreateBean方法
- 實例化,調用createBeanInstance方法
- 屬性注入,調用populateBean方法
- 初始化,調用initializeBean方法
(3)實例化,主要是通過調用createBeanInstance,又分兩步:
- 通過resolveBeanClass獲取beanClass對象,如果此類之前加載過直接返回,如果沒有加載過則通過ClassLoader加載;
- 實例化,通過無參構造方式實例化或通過@Autowire注解的構造方法實例化
(4)屬性注入,主要是通過調用populateBean方法
- 通過AutowiredFieldElement或AutowiredMethodElement調用inject方法
- bean注入最終又會調用getBean方法(循環依賴產生的地方)
- 拿到bean對象后,通過反射完成屬性注入
(5)初始化,主要是通過調用initializeBean方法(初始化東西最多)
5.1 調用實現Aware接口的方法:
- 調用 BeanNameAware 的 setBeanName 方法
- 調用 BeanClassLoaderAware 的 setBeanClassLoader
- 調用 BeanFactoryAware 的 setBeanFactory 方法
5.2 執行 BeanPostProcessor 的預初始化方法
- 調用 EnvironmentAware 的 setEnvironment 方法
- 調用 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法
- 調用 ResourceLoaderAware 的 setResourceLoader 方法
- 調用 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法
- 調用 MessageSourceAware 的 setMessageSource 方法
- 調用 ApplicationContextAware 的 setApplicationContext 方法
- 調用 BeanPostProcessor 的預初始化方法
5.3 調用普通初始化方法
- 調用 afterPropertiesSet 方法
- 調用 用戶定義的初始化方法,即init-method 屬性配置的方法