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

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring IOC 源码解析(四),Bean 的依赖注入和初始化

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址