首先需要知道一个大致实现
● 这个注入过程肯定是在 BeanPostProcessor 中实现的
●spring 是在 beanFactory.getBean 进行 bean 实例化的,即懒加载
● 根据第二条,也就是说在 getBean 的时候才会去调用所有 BeanPostProcessor
● 第二篇文章说到,BeanFactory 的 refresh 过程只是注册 BeanPostProcessor,真正执行在 getBean 方法中
(推荐视频:java视频教程)
MergedBeanDefinitionPostProcessor 也是一种 BeanPostProcessor 它重新弄了个一个生命周期函数,替代了 BeanPostProcessor 默认的生命周期函数,这么看吧,我贴一小段源码
for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof MergedBeanDefinitionPostProcessor) { MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp; bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName); } }
它允许你在非 BeanFactoryProcess 中去修改 Bean 定义
InstantiationAwareBeanPostProcessor 也是一种 BeanPostProcessor 它也重新定义了一个生命周期函数,它允许把属性值注入到属性对象中
@Autowired 加载定义的过程
我们先不看 bean 的创建过程,就看 MergedBeanDefinitionPostProcessor 的实现子类,这里看名字猜测
AutowiredAnnotationBeanPostProcessor 应该就是干这件事的,所以我们接下来可以直接看
AutowiredAnnotationBeanPostProcessor 的 postProcessMergedBeanDefinition 方法的代码。
顺着方法的调用,可以知道在 buildAutowiringMetadata 是真正查找这些注解的地方,最后 checkConfigMembers 将 Member 注册进了 bean 定义,具体如何查找的读者自行查看源码。
这里只是将 Member 注册进了 bean 定义,真正实例化在填充 Bean 的过程中,下面说到 bean 的创建过程可以知道是何时注入的。
Bean 的创建过程
前面说到 spring 是在 getBean 的过程中进行 Bean 创建的,创建 bean 分为几个步骤
1. 获取 bean 定义
2. new Bean()
3. 执行生命周期函数 (前)
4. 创建依赖项
5. 填充 bean
6. 执行生命周期函数(后)
入口为 BeanFactory.getBean ,BeanFactory 的实现类为 DefaultListableBeanFactory 这些你可以在 BeanFactory 的 refresh 过程中找到
根据源码,如果 bean 还不存在时,就会执行 bean 的创建流程
获取 bean 定义在这段源码中
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
紧跟着,根据 Bean 定义搜索其依赖项,并创建 bean ,可以看出是递归创建 bean
String[] dependsOn = mbd.getDependsOn(); for (String dep : dependsOn) { getBean(dep); }
然后就创建 bean 了
if (mbd.isSingleton()) { createBean(beanName, mbd, args); } // 真正的执行在 doCreateBean 过程中 Object beanInstance = doCreateBean(beanName, mbdToUse, args);
创建 bean 第一步 new Bean
if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); }
创建 bean 第二步,执行所有的 processor ,包含 MergedBeanDefinitionPostProcessor ,所以在这一步注册注入选项
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
创建 bean 第三步,填充 bean ,这里做的 @Autowired 注入
populateBean(beanName, mbd, instanceWrapper);
最终的处理过程在 AutowiredAnnotationBeanPostProcessor 的 postProcessPropertyValues 函数中
metadata.inject(bean, beanName, pvs);
因为在前面已经获取过依赖项,并且把其丢进了容器,所以这里是直接用反射写进去就可以了
创建 bean 第四步,初始化 bean ,这里有一个方法注入,方法注入原来发生在初始化 bean 过程中,还有就是生命周期函数执行了,包含 BeanPostProcessor 的前置后置生命周期,初始化方法等
小说明 :AutowiredAnnotationBeanPostProcessor 即是 一个 MergedBeanDefinitionPostProcessor 也是一个 InstantiationAwareBeanPostProcessor
本文来自php中文网,java教程栏目,欢迎学习!
以上是spring是如何注入对象的和bean创建过程分析的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

禅工作室 13.0.1
功能强大的PHP集成开发环境