接着上文,AbstractAutowireCapableBeanFactory 的 doCreateBean(beanName, mbdToUse, args) 方法中
首先调用 populateBean 进行依赖注入相关操作
该方法会调用 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 这个方法,这个 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors(beanFactory); 中就已经实例化完成放入容器了,用于处理依赖注入和 @Value 属性注入等相关操作
此处的 InjectionMetadata 就包含了需要注入的对象,此处包含注入对象 B 和 @Value("${test.as}"),值是直接从 injectionMetadataCache 中获取到的
那么 injectionMetadataCache 这个值是从哪里来的呢,实在 doCreateBean 中的 applyMergedBeanDefinitionPostProcessors 这个方法
然后调用 AutowiredAnnotationBeanPostProcessor 实现类
然后就有回到之前寻找依赖的方法,缓存中没有找到那么就构建当前对象依赖属性
buildAutowiringMetadata(final Class<?> clazz) 这个方法主要就是去寻找 @Autowired 和 @Value 标注的字段然后将其填充到 InjectionMetadata 返回
回到 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 这个方法,依赖找到了那么就开始调用 metadata.inject(bean, beanName, pvs); 注入相关属性了,注入操作主要是通过反射取设置当前依赖的值,如果发现依赖的对象还未实例化那么继续执行依赖对象的实例化
然后回到 AbstractAutowireCapableBeanFactory 的 doCreateBean 方法继续调用 initializeBean(beanName, exposedObject, mbd) 进行初始化
首先调用 invokeAwareMethods 里面的逻辑很清晰无需多说
然后调用 applyBeanPostProcessorsBeforeInitialization 这个方法,这个方法会遍历所有的 BeanPostProcessor 并且调用他们的 postProcessBeforeInitialization 方法旨在初始化前做一些事情(这些 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors 中就已经排好序了)
然后调用初始化方法,因为现在大多数实现都是基于注解的了,首先会检查 Bean 是否实现了 InitializingBean 接口,如果实现了就调用它的重写方法 afterPropertiesSet 可以用来修改 Bean 的属性值。最后如果定义了 InitMethod 的话就调用它
最后调用 applyBeanPostProcessorsAfterInitialization 方法它会遍历 BeanPostProcessors 调用其 postProcessAfterInitialization 在初始化后做一些事情