专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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

Bean 的依赖注入

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

57_1.png

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

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

57_3.png

57_4.png

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

57_5.png

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

57_6.png然后调用 AutowiredAnnotationBeanPostProcessor 实现类

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

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

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

Bean 的初始化

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

57_9.png

57_10.png

57_11.png

57_12.png

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

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

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

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

文章永久链接:https://tech.souyunku.com/26042

未经允许不得转载:搜云库技术团队 » Spring IOC 源码解析(四),Bean 的依赖注入和初始化

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们