Spring IOC 源碼解析(四),Bean 的依賴注入和初始化

Bean 的依賴注入

接着上文,AbstractAutowireCapableBeanFactory 的 doCreateBean(beanName, mbdToUse, args) 方法中緩存

首先調用 populateBean 進行依賴注入相關操做app

該方法會調用 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 這個方法,這個 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors(beanFactory); 中就已經實例化完成放入容器了,用於處理依賴注入和 @Value 屬性注入等相關操做

此處的 InjectionMetadata 就包含了須要注入的對象,此處包含注入對象 B 和 @Value("${test.as}"),值是直接從 injectionMetadataCache 中獲取到的 post

那麼 injectionMetadataCache 這個值是從哪裏來的呢,實在 doCreateBean 中的 applyMergedBeanDefinitionPostProcessors 這個方法ui

而後調用 AutowiredAnnotationBeanPostProcessor 實現類

而後就有回到以前尋找依賴的方法,緩存中沒有找到那麼就構建當前對象依賴屬性

buildAutowiringMetadata(final Class<?> clazz) 這個方法主要就是去尋找 @Autowired 和 @Value 標註的字段而後將其填充到 InjectionMetadata 返回3d

回到 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 這個方法,依賴找到了那麼就開始調用 metadata.inject(bean, beanName, pvs); 注入相關屬性了,注入操做主要是經過反射取設置當前依賴的值,若是發現依賴的對象還未實例化那麼繼續執行依賴對象的實例化cdn

Bean 的初始化

而後回到 AbstractAutowireCapableBeanFactory 的 doCreateBean 方法繼續調用 initializeBean(beanName, exposedObject, mbd) 進行初始化對象

首先調用 invokeAwareMethods 裏面的邏輯很清晰無需多說

而後調用 applyBeanPostProcessorsBeforeInitialization 這個方法,這個方法會遍歷全部的 BeanPostProcessor 而且調用他們的 postProcessBeforeInitialization 方法旨在初始化前作一些事情(這些 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors 中就已經排好序了)blog

而後調用初始化方法,由於如今大多數實現都是基於註解的了,首先會檢查 Bean 是否實現了 InitializingBean 接口,若是實現了就調用它的重寫方法 afterPropertiesSet 能夠用來修改 Bean 的屬性值。最後若是定義了 InitMethod 的話就調用它接口

最後調用 applyBeanPostProcessorsAfterInitialization 方法它會遍歷 BeanPostProcessors 調用其 postProcessAfterInitialization 在初始化後作一些事情it

相關文章
相關標籤/搜索