前言
看这篇文章之前,你一定要对createBean代码相当了解!因为文章不会写一处代码!
为什么?
为什么采用三级缓存?
spring默认不允许循环依赖,如果不考虑循环依赖的情况,一级缓存即可
为什么一层缓存不行?
一方面讲:拿spring的bean生命周期来说,创建实例,装填依赖,初始化内容,最终放到一级缓存中,一级缓存里放的就应该是最终的数据。如果要提前暴露,需要一层缓存。
二方面讲:考虑循环依赖,提前暴露的地址和最终的地址有可能不一样,这你得承认(你可以自定义postProcessor在postProcessAfterInitialization中进行修改),那么提前暴露的东西有没有被人用,就需要知晓,如果被人用了,但是地址不一样就,就需要报警!
为什么二层缓存不行?
这块得判断,不要哪层?
如果不要第二层
那么就是暴露的匿名内部类那里获取AOP(不考虑非AOP情况,因为bean不变,无意义)又分成两种情况,
获取匿名内部类后不移入一级缓存
显而易见,如果有多个使用提前暴露的,会生成多个引用
获取匿名内部类后移入一级缓存
保证了只生成一个引用,提前暴露的被人用了,也可以判断出来,但是显然不符合一级缓存存放最终bean的原则
如果不要第三层,那么就实例完,直接放到二级缓存,这样就判断不出来是否被人用了
==== 以上就是为什么用三级缓存的完整解释,完结,撒花!
网友评论