4和5的区别

正常情况下:4的环绕通知后文在after前。 5改成了环绕是在最前和最后
异常情况下:4的afterReturning在after后。 5改成了在前

循环依赖

实例化和初始化

实例化:只分配了一块内存,还没有给属性赋值
初始化:给其属性赋值完成

类比:像买个房子。
实例化就是买了个地方,盖了个毛坯房。但是没有装修
初始化就是装修完成了。
image.png

构造器、set、单多实例、哪个能解决循环依赖

通过构造方法注入,不能解决循环依赖(循环依赖不能解决)
通过set方法注入,可以解决循环依赖

如果组件是单实例的(默认值),不会有循环依赖。 如果是prototype,会出现循环依赖无法解决的情况

为什么通过构造方法不能解决循环依赖?

解决循环依赖靠的是 对象的提前暴露,也就是已经实例化,但是还没有初始化的对象,即半成品(也叫中间态)
所以关键在于对象的实例化和初始化分开。
但是如果通过构造器实例化,实例化的过程又是通过构造器实现的。 如果参数A还没创建好怎么提前暴露,所以构造器循环依赖无法解决。

如果不好理解,这样去理解:
正确流程是 A实例化-> A提前暴露 -> B实例化 -> B接收A然后set (构造器就是实例化的过程,实例化前提是其他对象提前暴露)
如果通过构造器注入,那么过程变成了这样 : B实例化(不成功,因为需要提前暴露的A,而A想实例化又需要提前暴露的B。但是B都没有实例化怎么提前暴露。)

三层缓存分别是什么

spring通过三级缓存来解决循环依赖的(三级缓存所在的默认类DefaultSingletonRegistry)
image.png
image.pngimage.png

解决循环依赖的过程

简述完成步骤

image.pngimage.pngimage.pngimage.pngimage.png

甘特图 (2).png
这里绿色入线没画。 出线画错了。正确答案你应该知道的对吧。

image.png