spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)

发布时间:2023年12月18日

bean的生命周期

Spring容器在进行实例化时,会将xml配置的的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean。
其中比较重要的是:

  • beanClassName:bean 的类名
  • initMethodName:初始化方法名称
  • properryValues:bean 的属性值
  • scope:作用域
  • lazyInit:延迟初始化
    在这里插入图片描述
    在这里插入图片描述

循环引入

建议去看https://www.bilibili.com/video/BV1yT411H7YK?p=40

在这里插入图片描述
在这里插入图片描述

解决方案

如果是set注入引起的循环依赖,spring提供的三级缓存大部分都可以解决。
如果是构造方法中就存在循环依赖,那么用@Lazy解决。

三级缓存

在这里插入图片描述

若只有一级缓存

在这里插入图片描述

二级缓存作用

在这里插入图片描述
但是二级缓存无法处理代理对象,因此有了三级缓存的存在。

二级缓存最核心的作用是,通过A的对象工厂创建代理对象,如果是多例的话,就会创建多个。直接把他们都放到二级缓存中方便管理且每次需要的话直接从里面拿就好了

三级缓存

在这里插入图片描述

源码(个人学习存档用)

//单实例对象注册器
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
    private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
}

@Lazy

在这里插入图片描述

文章来源:https://blog.csdn.net/zhiaidaidai/article/details/135022949
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。