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

bean的生命周期

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

  • beanClassName:bean 的类名
  • initMethodName:初始化方法名称
  • properryValues:bean 的属性值
  • scope:作用域
  • lazyInit:延迟初始化
    spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)_第1张图片
    spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)_第2张图片

循环引入

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

spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)_第3张图片
spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)_第4张图片

解决方案

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

三级缓存

在这里插入图片描述

若只有一级缓存

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

二级缓存作用

spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)_第6张图片
但是二级缓存无法处理代理对象,因此有了三级缓存的存在。

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

三级缓存

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

源码(个人学习存档用)

//单实例对象注册器
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

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

你可能感兴趣的:(spring面试,spring,面试,缓存,后端,java)