转载

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

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

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

首先调用 populateBean 进行依赖注入相关操作

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

该方法会调用 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 这个方法,这个 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors(beanFactory); 中就已经实例化完成放入容器了,用于处理依赖注入和 @Value 属性注入等相关操作

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

此处的 InjectionMetadata 就包含了需要注入的对象,此处包含注入对象 B 和 @Value("${test.as}"),值是直接从 injectionMetadataCache 中获取到的

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

那么 injectionMetadataCache 这个值是从哪里来的呢,实在 doCreateBean 中的 applyMergedBeanDefinitionPostProcessors 这个方法

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

然后调用 AutowiredAnnotationBeanPostProcessor 实现类

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

然后就有回到之前寻找依赖的方法,缓存中没有找到那么就构建当前对象依赖属性

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

buildAutowiringMetadata(final Class<?> clazz) 这个方法主要就是去寻找 @Autowired 和 @Value 标注的字段然后将其填充到 InjectionMetadata 返回

回到 AutowiredAnnotationBeanPostProcessor 的 postProcessProperties 这个方法,依赖找到了那么就开始调用 metadata.inject(bean, beanName, pvs); 注入相关属性了,注入操作主要是通过反射取设置当前依赖的值,如果发现依赖的对象还未实例化那么继续执行依赖对象的实例化

Bean 的初始化

然后回到 AbstractAutowireCapableBeanFactory 的 doCreateBean 方法继续调用 initializeBean(beanName, exposedObject, mbd) 进行初始化

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

首先调用 invokeAwareMethods 里面的逻辑很清晰无需多说

然后调用 applyBeanPostProcessorsBeforeInitialization 这个方法,这个方法会遍历所有的 BeanPostProcessor 并且调用他们的 postProcessBeforeInitialization 方法旨在初始化前做一些事情(这些 BeanPostProcessor 在 refresh() 中的 registerBeanPostProcessors 中就已经排好序了)

然后调用初始化方法,因为现在大多数实现都是基于注解的了,首先会检查 Bean 是否实现了 InitializingBean 接口,如果实现了就调用它的重写方法 afterPropertiesSet 可以用来修改 Bean 的属性值。最后如果定义了 InitMethod 的话就调用它

最后调用 applyBeanPostProcessorsAfterInitialization 方法它会遍历 BeanPostProcessors 调用其 postProcessAfterInitialization 在初始化后做一些事情

原文  https://juejin.im/post/5f086e0e5188252e3426d658
正文到此结束
Loading...