Spring 源码关键点之一:三级缓存

浏览过一些对spring三级缓存进行说明的文章,都说明了三级缓存的用途:解决循环依赖、支撑动态代理。但是感觉不能令人信服,缺少较详细的说明。

本文将从根本上,对为什么spring要有三级缓存进行探讨,以此来加深各位可亲可敬的程序员的理解。

什么是三级缓存

首先要说清楚,spring是做什么用的。spring最核心的功能,控制反转,依赖注入。名词不解释,本人对名词的理解也有限。白话说,就是内置bean容器,为上层应用提供bean的生命周期管理。

也就是大家要写代码时,例如Java中,写一个@Autowired,就可以完成自动注入,不需要自己去new对象。这有什么好处呢?应用里引入redis的时候,只需要写一个redisTemplate就行了。

这是个人的一点肤浅理解,未必正确,各位看官一听就行。

那么spring如何为代码中使用redisTemplate的地方,注入对应的对象呢?这个地方大家应该都可以想明白,创建一个redisTemplate对象,给所有需要注入的地方使用,也就是单例模式。

这个实现大家都可以想到,用一个集合把对象存起来,最好是使用Map<String,Object>这样一个集合,根据名字搜索时很快。没错,spring就是这样做的(这里我们忽略类型查找)。

在DefaultSingletonBeanRegistry类中有三个变量,是spring bean容器的三级缓存(一二三的顺序先忽略),就是下面代码片段中的三个map变量:

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {

    /** Maximum number of suppressed exceptions to preserve. */
    private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;


    /** Cache of singleton objects: bean name to bean instance. */
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

    /** Cache of singleton factories: bean name to ObjectFactory. */
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

    /** Cache of ear
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值