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

目录
相关文章
|
4月前
|
XML JSON Java
【SpringBoot(三)】从请求到响应再到视图解析与模板引擎,本文带你领悟SpringBoot请求接收全流程!
Springboot专栏第三章,从请求的接收到视图解析,再到thymeleaf模板引擎的使用! 本文带你领悟SpringBoot请求接收到渲染的使用全流程!
371 3
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
560 2
|
5月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
4527 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
705 0
|
6月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1068 3
|
11月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
565 0
|
11月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
408 0
|
11月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
507 0