接着上文,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