首页 > 其他分享 >spring三级缓存

spring三级缓存

时间:2024-05-05 10:34:01浏览次数:26  
标签:缓存 创建 spring 代理 二级缓存 AOP 三级

第一级缓存:singletonObjects

第二级缓存:earlySingletonObjects

第三级缓存:singletonFactories

先从“第一级缓存”找对象,有就返回,没有就找“二级缓存”;

找“二级缓存”,有就返回,没有就找“三级缓存”;

找“三级缓存”,找到了,就获取对象,放到“二级缓存”,从“三级缓存”移除。

 

  1. 在第一层中,先去获取 A 的 Bean,发现没有就准备去创建一个,然后将 A 的代理工厂放入“三级缓存”(这个 A 其实是一个半成品,还没有对里面的属性进行注入),但是 A 依赖 B 的创建,就必须先去创建 B;
  2. 在第二层中,准备创建 B,发现 B 又依赖 A,需要先去创建 A;
  3. 在第三层中,去创建 A,因为第一层已经创建了 A 的代理工厂,直接从“三级缓存”中拿到 A 的代理工厂,获取 A 的代理对象,放入“二级缓存”,并清除“三级缓存”;
  4. 回到第二层,现在有了 A 的代理对象,对 A 的依赖完美解决(这里的 A 仍然是个半成品),B 初始化成功;
  5. 回到第一层,现在 B 初始化成功,完成 A 对象的属性注入,然后再填充 A 的其它属性,以及 A 的其它步骤(包括 AOP),完成对 A 完整的初始化功能(这里的 A 才是完整的 Bean)。
  6. 将 A 放入“一级缓存”。

一级缓存 :可以用大的

二级缓存:半成本,未对属性赋值  未初始化未填充属性提前暴露的Bean

singletonFactories:三级缓存,存储生产单实例Bean的工厂 

 

只需要一级和三级缓存也可以做到解决循环依赖的问题

只要两个缓存确实可以做到解决循环依赖的问题,但是有一个前提这个bean没被AOP进行切面代理,如果这个bean被AOP进行了切面代理,那么只使用两个缓存是无法解决问题,下面来看一下bean被AOP进行了切面代理的场景

 

所以如果没有AOP的话确实可以两级缓存就可以解决循环依赖的问题,如果加上AOP,两级缓存是无法解决的,不可能每次执行singleFactory.getObject()方法都给我产生一个新的代理对象,所以还要借助另外一个缓存来保存产生的代理对象

 

标签:缓存,创建,spring,代理,二级缓存,AOP,三级
From: https://www.cnblogs.com/52hadoop/p/18173265

相关文章

  • spring生命周期
    1:Bean的建立:容器寻找Bean的定义信息并将其实例化。2:属性注入:使用依赖注入,Spring按照Bean定义信息配置Bean所有属性3:BeanNameAware的setBeanName():如果Bean类有实现org.springframework.beans.BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。4:BeanFactoryAw......
  • springboot为什么要用延迟导入?
    SpringBoot使用了多种方式来实现自动配置,其中DeferredImportSelector接口是这些机制之一。DeferredImportSelector是ImportSelector的一个扩展,它允许延迟导入配置类直到所有@Configuration类都被处理完毕。这对于某些自动配置类需要在应用程序上下文的创建过程中的后期阶段才能......
  • K8S 创建Spring-boot项目并进行项目启动与访问
     ##Spring-boot 的helloworld项目packagecom.example.demo;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMappi......
  • 狂神spring学习笔记
    1.Spring1.简介一个融合器,一个简化开发的框架spring官网github地址2.Maven坐标<!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&......
  • 配置session——缓存
    1、服务器+redis安装启动2、djangoa、安装链接redis包pipinstalldjango-redisb、settings.py```MIDDLEWARE=['django.contrib.sessions.middleware.SessionMiddleware',]#sessionSESSION_ENGINE='django.contrib.sessions.backends.cache'SESSION_CAC......
  • SpringMVC(3)-request域和session域的作用和区别
    最近看到项目中用到request域和session域,脑子里一直没有一个明确的区分,结合GPT整理了一份总结。为了理解request和session的作用和区别,可以想象我们正在参加一个大型的科技会议。会议中,每位与会者(用户)都会与会议工作人员(服务器)进行交流。在这个比喻中,request域和session域是用于......
  • redis缓存和业务应用了解
    转自:https://tech.meituan.com/2017/03/17/cache-about.html1.介绍在主页中显示最新的项目列表:Redis使用的是常驻内存的缓存,速度非常快。LPUSH用来插入一个内容ID,作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需要的检索的数据量超越这个缓存容......
  • 缓存特征了解
    转自:https://tech.meituan.com/2017/03/17/cache-about.html1.介绍1.1命中率命中率=返回正确结果数/请求缓存次数,命中率问题是缓存中的一个非常重要的问题,它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。1.2最大元素缓存中可以存放的最大元素的数量,一旦缓......
  • Spring Boot的自动装配
    SpringBoot的自动装配(Auto-Configuration)是一种设计机制,旨在减少传统Spring应用中繁复的XML配置和大量的手动Bean定义。@EnableAutoConfiguration:该注解是自动装配的入口,通常在SpringBoot应用的主配置类上使用。它通过@Configuration表明该类为配置类,并通过@Import导入一......
  • Spring AOP
    AOP简介A0P(AspectOrientedProgramming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(objectOrientedProgramming)面向对象编程作用:在不惊动原始设计的基础上为其进行功能增强Spring理念:无入侵式/无侵入式AOP核心概念连接点(JoinPoint):程序执行过程中的......