接着上文,AbstractAutowireCapableBeanFactory 的 doCreateBean(beanName, mbdToUse, args) 方法中緩存
首先調用 populateBean 進行依賴注入相關操做app
此處的 InjectionMetadata 就包含了須要注入的對象,此處包含注入對象 B 和 @Value("${test.as}"),值是直接從 injectionMetadataCache 中獲取到的 post
那麼 injectionMetadataCache 這個值是從哪裏來的呢,實在 doCreateBean 中的 applyMergedBeanDefinitionPostProcessors 這個方法ui
buildAutowiringMetadata(final Class<?> clazz) 這個方法主要就是去尋找 @Autowired 和 @Value 標註的字段而後將其填充到 InjectionMetadata 返回3d
回到 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 這個方法,依賴找到了那麼就開始調用 metadata.inject(bean, beanName, pvs); 注入相關屬性了,注入操做主要是經過反射取設置當前依賴的值,若是發現依賴的對象還未實例化那麼繼續執行依賴對象的實例化cdn
而後回到 AbstractAutowireCapableBeanFactory 的 doCreateBean 方法繼續調用 initializeBean(beanName, exposedObject, mbd) 進行初始化對象
而後調用 applyBeanPostProcessorsBeforeInitialization 這個方法,這個方法會遍歷全部的 BeanPostProcessor 而且調用他們的 postProcessBeforeInitialization 方法旨在初始化前作一些事情(這些 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors 中就已經排好序了)blog
而後調用初始化方法,由於如今大多數實現都是基於註解的了,首先會檢查 Bean 是否實現了 InitializingBean 接口,若是實現了就調用它的重寫方法 afterPropertiesSet 能夠用來修改 Bean 的屬性值。最後若是定義了 InitMethod 的話就調用它接口
最後調用 applyBeanPostProcessorsAfterInitialization 方法它會遍歷 BeanPostProcessors 調用其 postProcessAfterInitialization 在初始化後作一些事情it