0

0

spring是如何注入对象的和bean创建过程分析

angryTom

angryTom

发布时间:2019-11-28 17:47:53

|

3393人浏览过

|

来源于博客园

转载

spring是如何注入对象的和bean创建过程分析

首先需要知道一个大致实现

● 这个注入过程肯定是在 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()

自学 PHP、MySQL和Apache
自学 PHP、MySQL和Apache

本书将PHP开发与MySQL应用相结合,分别对PHP和MySQL做了深入浅出的分析,不仅介绍PHP和MySQL的一般概念,而且对PHP和MySQL的Web应用做了较全面的阐述,并包括几个经典且实用的例子。 本书是第4版,经过了全面的更新、重写和扩展,包括PHP5.3最新改进的特性(例如,更好的错误和异常处理),MySQL的存储过程和存储引擎,Ajax技术与Web2.0以及Web应用需要注意的安全

下载

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教程栏目,欢迎学习!  

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring中文手册
Spring中文手册

共0课时 | 0人学习

马士兵spring视频教程
马士兵spring视频教程

共25课时 | 9万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号