Spring循环依赖

AOP知识前倾概要

类的前两个字母大写 生成的beanName前两个也是大写的

那会打印zhouyuBefore吗?

答:不会

AOP是在初始化后执行的

如果传入的是AService对象那返回的就是AService的代理对象

没有开启AOP BeanPostProcessor有6个

开启AOP后

多了一个AnnotationAwareAspectJAutoProxyCreator

每个BeanPostProcessor都会调用这个初始化后方法postProcessAfterInitialization()

就是多的这个AnnotationAwareAspectJAutoProxyCreator去进行AOP,生成代理对象

什么是循环依赖?

spring创建bean的时候是串行去创建的,而不是并发的

循环依赖出现的场景

解决方法:

三级缓存,也就是3个Map

增加中间人(缓存)打破循环

解决方案

1.实例化完给他放到一个Map中,key是beanName,value是bean的原始对象(此时属性都没有值 除非提前用构造方法赋值了)

2.然后去单例池找BService,发现没有再去map中找,发现还没有,就去创建BService

2.B实例化完也放入到这个map中,然后去单例池中找AService,发现没有,于是去map中拿,发现可以正常拿到了,于是继续执行接下来的步骤

整个过程都是串行的。

因为一直操作的都是同一个对象,看似a对象的属性没有赋值,但是最后其实是会经历完整的赋值操作的。

因为操作的对象没有变过。

**那为什么需要第三个map?**其实是给代理用的

对于AService而言,假如需要进行AOP

那初始化后得到的就是AService的代理对象,然后放入单例池中

那此时填充给BService的a属性的对象是原始对象而不是代理对象

B依赖的A和最终的A不是同一个对象

解决方案【提前AOP】:

直接实例化后就执行AOP,无需增加一个map

但是对于bean的生命周期而言AOP应该是在初始化后进行的,不符合bean生命周期设计

那如何判断AService是否出现循环依赖?在哪判断?

填充AService属性的时候,通过这个set就能判断出AService是不是正在创建中,说明AService发生了循环依赖

只有AOP才需要把代理对象赋值给AService属性,否则还是赋值的原始对象

如果我再加个CService

此时就要填充CService的属性

这时同样判断出AService出现循环依赖,难道又要再次生成AService的代理对象??

所以这时候才引入了二级缓存的这个map,第一次AOP完生成代理对象就存入这个earlySingletonObjects的map中。

earlySingletonObjects

不管有没有进行AOP最后放入到earlySingletonObjects的不是原始对象就是代理对象

singletonObjects:单例池 存的是完整走过bean的生命周期的bean对象

earlySingletonObjects:存的是暂时还没经过完整生命周期的bean对象【保证单例】

总结:

A对象有个B对象的成员变量,B对象有个A对象的成员变量,此时A对象要进行属性填充,但B对象还没有创建好,此时就需要去创建B对象,但是此时A对象也没创建好,于是陷入循环。。。

这时候,就有个办法,A对象生成后马上把自己放入到一个map中,这样B对象就能从这个map里取到A对象执行后续操作,且操作的是同一个对象。但是有个问题,就是如果是要执行AOP,那此时填充给B对象的A属性的对象是原始对象而不是代理对象,所以B依赖的A和最终的A不是同一个对象

此时就引出了2级缓存earlySingletonObjects这个map。

在判断完有没有出现循环依赖以后,

相关推荐
她的男孩2 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
爱读源码的大都督2 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝2 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
ITOM运维行者3 小时前
从零搭建企业级服务器监控体系:踩坑实录与架构设计
前端·后端
用户4099322502123 小时前
Vue状态管理入门第四章:组合式store和SSR风险
前端·vue.js·后端
用户34232323763173 小时前
SPI 通信与高速外设驱动详解
后端
魏祖潇3 小时前
SDD 完整指南——Spec 端打底、Story 端交付、留白区
人工智能·后端
feelmylife594 小时前
消息队列可靠投递与幂等消费 -- 从"消息丢了"到"消息别重复"的完整工程实践
后端
雪隐4 小时前
个人电脑玩AI-10让5060 Ti给你打工——部署 Odysseus:终于有个能打的"AI管家"了
人工智能·后端
荣码4 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python