如果持有了某一个对象的引用,那么能否在后续步骤的时候给该对象进行属性赋值?
将实例化的过程和初始化的过程分开执行
ObjectFactory是一个函数式接口,在java中,方法的参数传递都是值传递,我们在进行方法调用的时候必须要指定准确的值,而ObjectFactory参数类型可以让我们传递一个lambda表达式作为方法的参数,在调用此方法的时候,lambda表达式不会立刻执行,只有在方法的内部调用getObject方法的时候才会去执行lambda表达式的处理逻辑
1、三个map结构分别存储什么对象
一级缓存:成品对象
二级缓存:半成品对象
三级缓存:lambda
2、当我们查找对象的时候,三个map结构的顺序是什么?
先找一级,找不到再找二级,再找不到再找三级
3、如果只有一个map结构,能否解决循环依赖问题?
理论上是可行的,但是需要在一个map结构中对成品对象和半成品对象作区分,而对象的名字都是固定的,key值不可以变,那么只能在value中设置标志位来标识到底是成品对象还是半成品对象,这样我们在获取元素的时候都要获取到对应的value并且从value中获取标志位来判断,代码逻辑很麻烦不够优雅,直接用两个缓存就可以解决这个问题
4、如果只有两个map结构,能否解决循环依赖问题?
可以解决,但是有前提条件:当不需要创建代理对象或者没有aop的时候,二级缓存就可以解决循环依赖问题
5、为什么要使用三级缓存?三级缓存存在的意义到底是啥?
《1》同一个容器中,能否出现同名的不同对象?
不能
《2》代理对象在创教前是否需要创建出原始对象?
需要
《3》当原始对象创建好之后,后续又创建了代理对象,我们在获取对象的时候应该获取哪一个?
理论上来说应该是代理对象,但是程序是死的,他如何知道哪个是代理对象,哪个是原始对象呢?
当创建出代理对象之后,就要覆盖原始对象,对外暴露的就是代理对象
《4》整个过程中为什么需要三级缓存或者lambda表达式在里面到底是什么作用?
bean对象的创建是有自己的生命周期的,实例化,初始化,在初始化环节会先对对象进行属性的赋值工作,而正常的代理对象的创建是BeanPostProcessor的后置处理方法中完成的,此方法的执行是要滞后于populateBean方法的,也就是说会产生一种情况,先完成属性的赋值,然后再进行代理对象的创建,那么就会出现赋值的时候赋值的是原始对象,但是在赋值完成之后对对象进行了代理的创建,所以就会出现版本不一致的问题(this means that said other beans do not use the final version of the bean)
《5》怎么解决?
解决方法非常简单,只需要将动态代理对象的创建前置即可,也就是说在进行对象的属性赋值的最后一刻必须要唯一性的确定出要赋值的对象到底是原始对象还是代理对象,所以三级缓存使用了lmabda表达式,而lambda表达式的执行逻辑里就是来确定对外暴露的是原始对象还是代理对象
spring是一个跟业务无关的框架,只能预防一些异常情况的产生,但是不代表可以解决所有的问题,就跟我们日常写业务代码一样,你写了异常处理机制了,但是不能解决所有的异常情况