首页 > 编程语言 >spring源码笔记

spring源码笔记

时间:2023-06-24 23:56:03浏览次数:43  
标签:缓存 spring 笔记 源码 doCreateBean doGetBean 创建 Set 三级

Bean创建流程

  1. 获取对象的BeanDefinition
  2. 通过反射创建空对象
  3. 填充属性
  4. 调用init方法

 
 

Bean创建关键方法(按顺序)

  1. getBean
  2. doGetBean
  3. createBean
  4. doCreateBean
  5. createBeanInstance
  6. populateBean

 
 

解决循环依赖:三级缓存

循环依赖原因

单例,每个类只有一个对象。A引用B,B又引用A。创建A时,需要把B塞入A中,此时B还没有创建,需要创建B。但B创建又需要A,形成一个死循环。

 
 

流程

doGetBean -> getSingleton

  1. 从一级缓存singletonObjects拿A,拿不到,需要创建A
  2. 将A放入Set: singletonsCurrentlyInCreation
  3. 实例化A
    • createBean -> doCreateBean (A)
      • doGetBean (B)
  4. 将A从Set: singletonsCurrentlyInCreation中删除
  5. 将A放入一级缓存singletonObjects,同时从二级缓存、三级缓存中删除
  6. 结束

 

doCreateBean

  1. 反射创建A对象
  2. 若A在Set: singletonsCurrentlyInCreation里,则放入三级缓存singletonFactories
  3. populateBean A,填充A属性
    • applyPropertyValues -> resolveValueIfNecessary (此时B是RuntimeBeanReference) -> resolveReference -> beanFactory.getBean -> doGetBean (B)
  4. 依次从一级缓存 -> 二级缓存 尝试拿A,拿到A
  5. 结束

 

关键差异流程

  1. 当B getSingleton(A) 时,从三级缓存里拿A的ObjectFactory(此时A已经在三级缓存里)
  2. 一旦从三级缓存中能拿到值,则立马调用从三级缓存中取出来的ObjectFactory.getObject,并把生成出的半成品放入二级缓存earlySingletonObjects中,最后从三级缓存中删去

 
 

学习到的代码知识

  1. SetFromMap 用于借助ConcurrentHashMap来实现线程安全的Set

标签:缓存,spring,笔记,源码,doCreateBean,doGetBean,创建,Set,三级
From: https://www.cnblogs.com/GY8023/p/17501722.html

相关文章

  • spring-boot-maven-plugin插件详解
    一、为什么SpringBoot项目自带这个插件当我们在SpringBoot官方下载一个脚手架时,会发现pom.xml会自带spring-boot-maven-plugin插件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2......
  • 11.springboot 原理 ( 起步依赖-自动配置)
    springboot原理springframeworkspringboot(配置起步依赖-自动配置)spring-boot-starter-web起步依赖(其他依赖自动传递)自动配置原理:自动将内置类存入IOC容器中,不用收到配置,只能扫描包内即子包的类,可以指定扫描的包内容:@ComponentScan("com.alex","com.ite");@Import导......
  • SpringCloud学习(三)
    微服务应用参考:https://blog.csdn.net/qq_25928447/article/details/124198071?spm=1001.2014.3001.5501分布式权限校验回顾之前进行权限校验的原理,服务器是如何判定一个请求是来自哪个用户的:首先浏览器会向服务端发送请求,访问网站。服务端收到请求后,会创建一个SESSION......
  • 系统架构设计师笔记第22期:软件可靠性建模
    软件可靠性建模是指通过分析软件系统的特征和行为,预测其可能出现的故障和失效情况,从而评估软件系统的可靠性和安全性。软件可靠性建模通常使用统计方法和数学模型,以定量分析软件系统的可靠性和安全性。以下是一些常见的软件可靠性建模方法:故障树分析(FTA):FTA是一种演绎推理方法,通过识......
  • 【js学习笔记四】数组双重去重的方式三filter
     目录前言导语运行结果总结前言   我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语   数组......
  • 【js学习笔记五】数组双重去重的方式四先排序在对比
     目录前言导语 代码部分运行结果总结前言   我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语......
  • spring aop里的三种不同类型的自动代理介绍
    springaop里的三种不同类型的自动代理介绍MetadataautoproxyingBeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreator Metadataautoproxying介绍在SpringAOP中,Metadataautoproxying(元数据自动代理)是一种基于元数据配置的自动代理创建方式,它是我们最常用的一种自......
  • [java学习] Spring的分页插件的使用
    概述:SSM集成常会使用到分页,Spring中提供了方便实用的分页插件  第一步:在Mybatis配置文件(SqlMapConfig.xml)中配置插件组件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://myb......
  • markdown 笔记转 html 单文件
    markdown笔记转html单文件图片转base64![image][imageid][imageid]:yourimage'sbase64markdown转html工具i5ting_toc安装安装nodejs环境:https://nodejs.org/en/npminstalli5ting_toc-g使用进入md文件所在目录,打开cmd窗口输入命令i5ting_toc-fin......
  • 什么是Spring AOP里的引入(Introduction)?
    在SpringAOP中,引入(Introduction)是一种特殊类型的通知,允许我们向现有的类添加新的接口和实现,而无需修改原始类的代码。引入提供了一种扩展现有类功能的方式,它允许我们在运行时为类动态地添加新的方法和属性。通过引入,我们可以将新的行为添加到现有的类中,而无需继承该类或修改其代......