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的实例化以及加载方法还有就是循环依赖的处理。

目录
相关文章
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
1066 26
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
511 12
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
630 12
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
591 6
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1439 0
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1347 0
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
588 0
|
9月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
646 4
|
9月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1177 3
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
1115 0