• Spring缓存源码剖析:(二)CacheManager


    一、CacheManager总览

    如果需要Spring缓存可以正常工作,必须配置一个CacheManager。

     CacheManager实现类你可以配置Spring-context本身提供的SimpleCacheManager和ConcurrentMapCacheManager等。或者使用RedisCacheManager将缓存内容存放到Redis中。下面类图中RedisCacheManager来自于spring-data-redis  jar包中,AbstractTransactionSupportingCacheManager来自Spring-context-support jar包中。本系列文章主要关注spring-context jar包。

    二、CacheManager接口 


    CacheManager简单描述就是用来存放Cache,Cache用于存放具体的key-value值。举个栗子:一个Cache的名字是“奶牛厂”,那么这个Cache中可以根据“小白”获得叫做小白的奶牛,“小黑”获得叫做小黑点奶牛。 

    三、AbstractCacheManager抽象类

    AbstractCacheManager提供了基本的操作,如果已经存在的CacheManager无法满足使用要求,可以继承AbstractCacheManager类实现自己的CacheManager。 

     afterPropertiesSet()方法。来自实现的org.springframework.beans.factory.InitializingBean接口,在Bean实例化之后调用。这里使用了模板方法模式,loadCaches()方法的实现交给具体的子类,大致意思就是:这里需要得到Cache的集合,具体这个Cache集合从哪里来,具体的Cache的实现类是什么一概不管。

    getCache(String)方法。即根据Cache名称获取与之对应的Cache,如果没有找到对应的Cache,则会调用getMissingCache(String),默认getMissingCache返回null。将决定权交给实现者,你可以创建一个Cache,或者记录日志。

    updateCacheNames(String)方法。如果getMissingCache后cache不为空,这里会调用updateCacheNames方法,更新cacheNames集合。cacheNames是一个只读的Set,每次更新需要重新创建新的Set。

      lookupCache(String) 方法。根据一个Cache名称得到对应的Cache,如果没有就返回null,不会触发getMissingCache方法。

     decorateCache(Cache)方法。加入getMissingCache方法创建了Cache的实例,则会调用decorateCache方法对原有的Cache进行一次包装,这个通过方法名字应该可以猜到可能会用到修饰模式(也有叫装饰模式等),这里也没有给出具体实现。

    我们来看一个实现该方法的例子,就拿RedisCacheManager来看:

    在RedisCacheManager中decorateCache方法直接调用父类AbstractTransactionSupportingCacheManager中的decorateCache方法,如果条件是“可感知事务的”,则会用事务的Cache修饰器类将原有的Cache实例包裹一层,增加相关操作。

      

  • 相关阅读:
    附加作业
    我的个人总结
    进度更新
    结对编程——电梯调度
    程序阅读的改进
    WordCount
    阅读程序
    VS2013单元测试
    附加作业
    个人最终总结
  • 原文地址:https://www.cnblogs.com/bobsha/p/6507165.html
Copyright © 2020-2023  润新知