Spring&SpringBoot源码笔记整理 |Bean的加载流程一

简介: 本篇文章主要介绍Bean的加载流程,以及Spring是怎么解决循环依赖的问题。

微信截图_20220531122856.png

本篇文章主要介绍Bean的加载流程,以及Spring是怎么解决循环依赖的问题。 老规矩,图先上,结合图和源码一起才能更好的理解,首先看下Bean的加载的是时序图: 微信截图_20220531122826.png

接下来是看下SpringBoot启动过程初始化所有非懒加载Bean的入口代码,结合上面的时序图,进入主要代码的解读。

微信截图_20220531122705.png微信截图_20220531122617.png微信截图_20220531122503.png梳理下大致的流程:

  1. 从单例加载bean,spring里bean为什么是单例的是个老生常谈的问题了
  2. 实例化bean
  3. 依赖检查,在这一步一般会报依赖找不到或者依赖项目因为版本原因接口报错
  4. 转化BeanDefinition为RootBeanDefinition
  5. 对不同的作用域进行bean的创建
  6. 类型转换

接下来继续结合上面的时序图分析

@1.1 getSingleton(beanName) 从缓存中获取单例bean

微信截图_20220531122433.png上述代码可知Spring会先从singletonObjects中获取Bean,获取不到再从earlySingletonObjects中获取,在获取不到就从singletonFactories获取对应的Objecfactory,调用getObject()方法去创建bean.解释下上边几个map的作用。 微信截图_20220531122349.png也就是说Spring的bean在处于不同阶段的时候会由不同的缓存去存贮。

@1.2  getMergedLocalBeanDefinition(beanName)
这个方法会将BeanDefinition转为RootBeanDefinition,如果是子类的话还可以合并父类的BeanDefinition,大致说下RootBeanDefinition是干嘛的,其实就是用来定义Bean的,该Bean是什么类型的,需要注入的属性,定义Bean的构造方法等,因篇幅问题只叙述Bean的加载过程,不多在概述。
@1.3 getSingleton(beanName, ObjectFactory) ,这个方法的参数是一个beanName,和一个内部类,内部类的方法返回的是createBean(beanName, mbd, args)字面意思就是创建Bean,下面开始深入此方法(省略部分)。

微信截图_20220531122247.png梳理下,流程如下:

  1. 判断该Bean是否加载过
  2. 没有加载,记录beanName的状态
  3. 调用createBean创建Bean(重点)
  4. 调用Bean创建完成后的方法
  5. 加入缓存,并移除各种辅助状态

下一节继续解读创建bean和bean的实例化以及加载方法还有就是循环依赖的处理。

目录
相关文章
|
1天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
1天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
7天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
35 6
|
8天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
53 3
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
244 2
|
2天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
9天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
53 14
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
49 1
SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
47 2
 SpringBoot入门(7)- 配置热部署devtools工具