当前位置: 首页 > article >正文

Java-36 深入浅出 Spring - IoC容器体系 BeanFactory过程分析 Bean Lazy-Init

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(已更完)
  • Spring(正在更新…)

在这里插入图片描述

BeanFactory

在这里插入图片描述

子流程关键步骤

Resource 定位:指定 Beandefinition 的资源定位过程,就是 JavaBean 信息的 XML 文件,将其封装为 Resource 对象。

BeanDefinition 载入:把用户定义好的 JavaBean 表示为 IoC 容器内部的数据结构,这个容器内部的数据结构就是 BeanDefinition。

过程分析

子流程入口在 AbstractRefreshableApplicationContext#refreshBeanFactory 方法中:

AbstractRefreshableApplicationContext 类的内容如下:
在这里插入图片描述

方法中的 refreshBeanFactory 的内容如下:
在这里插入图片描述

loadBeanDefinitions(beanFactory):加载应用中的 BeanDefinitions
在这里插入图片描述
依次调用多个类 loadBeanDefinitions 方法:

  • 第一步:AbstractXmlApplicationContext
  • 第二步:AbstractBeanDefinitionReader
  • 第三步:XmlBeanDefinitionReader
  • 第四步:XmlBeanDefinitionReader 的 doLoadBeanDefinition 方法

一级一级走:
在这里插入图片描述

我们重点观察 XmlBeanDefinitionReader 类的 registerBeanDefinitions 方法,期间产生了多次重载调用。
在这里插入图片描述
我们接着进入 createReaderContext 函数:
在这里插入图片描述
接着往后跟(后续的函数方法),最后会走到:DefaultNamespaceHandlerResolver,这里完成了 NamespaceHandlerResolver 的初始化工作。
在这里插入图片描述

我们在 DefaultBeanDefinitionDocumentReader 中,找到 registerBeanDefinition 方法:
在这里插入图片描述

我们根据 doRegisterBeanDefinitions:
在这里插入图片描述

当前方法的末尾,调用了 parseBeanDefinition:
在这里插入图片描述
继续跟入,此时的 parseDefaultElement 解析 Bean 元素:
在这里插入图片描述

这里就是解析 Bean 的过程:
在这里插入图片描述
我们继续向下找,processBeanDefinition,在这个地方,BeanDefinitionReaderUtils.registerBeanDefinition 完成了对 Bean 的注册:
在这里插入图片描述

Bean

通过最开始的关键时机点分析,我们知道 Bean 的创建子流程入口在:
AbstarctApplicationContext#refresh()方法的 finishBeanFactoryinitialization(beanFactory)出:
(AbstractApplicationContext 中 refresh 函数中)
在这里插入图片描述
跟入后,可以看到最后的:preInstantiateSingletons,这里实例化所有立即加载的单例 Bean
在这里插入图片描述
最终跟入后,我们发现都是通过 getBean 方法来实例化的。
在这里插入图片描述

lazy-init

延迟加载机制,普通 Bean 的初始化是在容器初始化阶段运行的,而被 lazy-init=true 的修饰的 bean,是从容器中第一次执行 context.getBean 的时候触发。
Spring 启动的时候会把所有 Bean 的信息(包括 XML 和注解)解析转化为 Spring 能够识别的 BeanDefinition 并存到 HashMap 里,给后续得初始化使用,然后对每个 BeanDefinition 进行处理,如果是懒加载则在容器初始化阶段不处理,其他的在容器初始化阶段进行初始化进行依赖注入。

在这里插入图片描述


http://www.kler.cn/a/459481.html

相关文章:

  • Ubuntu执行sudo apt-get update失败的解决方法
  • 面试经典问题 —— 链表之返回倒数第k个节点(经典的双指针问题)
  • java springBoot项目 类加载与启动流程
  • 国产手机嘴上喊着挑战苹果,实际行动却已承认失败,真的干不过
  • pip安装paddle失败
  • 六年之约day3
  • Spring Boot集成Netty创建一个TCP服务器,接收16进制数据(自定义解码器和编码器)
  • 纯血鸿蒙ArkUI线性布局详解
  • 【Vue 教程】使用 Vite 快速搭建前端工程化
  • Go singleflight库源码分析
  • 2.阿里云flinkselectdb-jar作业
  • 【React】- 跨域PDF预览、下载(改文件名)、打印
  • Flink如何处理迟到数据?
  • Python毕业设计选题:基于Hadoop 的国产电影数据分析与可视化_django+spider
  • C++ 函数式编程Lambda表达式
  • 磁编码器(Magnetic Encoder)
  • 【每日学点鸿蒙知识】Web嵌套滚动体验、拷贝传递 ArrayBuffer异常问题、ObjectLink 的属性传递、构建读取参数
  • 【高阶数据结构】红黑树封装map、set
  • leetcode hot100 tire前缀树
  • go语言中zero框架项目日志收集与配置
  • 【2024年-7月-6日-开源社区openEuler实践记录】探秘 Qingzhou:开启高效开发与运维新旅程
  • 012-spring的注解开发、bean的属性、IOC实现原理
  • 【服务器】上传文件到服务器并训练深度学习模型下载服务器文件到本地
  • 基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
  • EL表达式与JSTL
  • Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读