前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot Cache 深入

SpringBoot Cache 深入

原创
作者头像
tanoak
发布2018-07-13 19:58:33
4230
发布2018-07-13 19:58:33
举报
文章被收录于专栏:java闲聊java闲聊

这上一篇文章中我们熟悉了SpringBoot Cache的基本使用,接下来我们看下它的执行流程

  1. CacheAutoConfiguration 自动装配类
代码语言:txt
复制
 根据图中标注,看到它引用了CachingConfigurationSelector这个类
a2.png
a2.png
代码语言:txt
复制
 静态内部类,实现了 selectImports()这个方法 ,这个方法用于添加配置类
代码语言:txt
复制
 通过debugger观察 imports[]数组,在控制台中看到 SimpleCacheConfiguration类的配置生效
代码语言:txt
复制
代码语言:txt
复制
    static class CacheConfigurationImportSelector implements ImportSelector {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
代码语言:txt
复制
        CacheType[] types = CacheType.values();
代码语言:txt
复制
        String[] imports = new String[types.length];
代码语言:txt
复制
        for (int i = 0; i < types.length; i++) {
代码语言:txt
复制
            imports[i] = CacheConfigurations.getConfigurationClass(types[i]);
代码语言:txt
复制
        }
代码语言:txt
复制
        return imports;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
  1. SimpleCacheConfiguration 配置类

创建ConcurrentMapCacheManager对象 ,给容器注册了CacheManage=>ConcurrentMapCacheManage

代码语言:txt
复制

@Bean

public ConcurrentMapCacheManager cacheManager() {

代码语言:txt
复制
   ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();
代码语言:txt
复制
   List<String> cacheNames = this.cacheProperties.getCacheNames();
代码语言:txt
复制
   if (!cacheNames.isEmpty()) {
代码语言:txt
复制
       cacheManager.setCacheNames(cacheNames);
代码语言:txt
复制
   }
代码语言:txt
复制
   return this.customizerInvoker.customize(cacheManager);

}

代码语言:txt
复制
  1. ConcurrentMapCacheManager 类

图片上传失败...(image-2a6db9-1530901912375)

b2.png
b2.png

找到getCache()这个方法,根据方法名就可以知道这是获取缓存的方法

代码语言:txt
复制
    @Override

    @Nullable

    public Cache getCache(String name) {

        Cache cache = this.cacheMap.get(name);

        if (cache == null && this.dynamic) {//判断是否为null

            synchronized (this.cacheMap) {//加锁

                cache = this.cacheMap.get(name);

                if (cache == null) {

                    cache = createConcurrentMapCache(name);//保存至createConcurrentMapCache

                    this.cacheMap.put(name, cache);

                }

            }

        }

        return cache;

    }

createConcurrentMapCache方法

代码语言:txt
复制
protected Cache createConcurrentMapCache(String name) {

        SerializationDelegate actualSerialization = (isStoreByValue() ? this.serialization : null);

        return new ConcurrentMapCache(name, new ConcurrentHashMap<>(256),

                isAllowNullValues(), actualSerialization);



    }

回到ConcurrentHashMap类,找到lookup()这个方法 ,这个缓存Key是怎么得到的呢,对这个方法打断点,看它的调用栈

代码语言:txt
复制
@Override

    @Nullable

    protected Object lookup(Object key) {

        return this.store.get(key);

    }
e2.png
e2.png

进入generatorKey()这个方法

c3.png
c3.png

找到这个接口,是不是有了熟悉的感觉,这就是自定义主键生成策略需要实现的接口

d2.png
d2.png

致此,整合流程也就走完了,这里增加一点内容关于@Caching

代码语言:txt
复制
这个注解相当于把 @CachePut、 @CacheEvict、@Cacheable这三个注解组合在一起,增加了灵活性,使用与之前类似,就不展开了
f2.png
f2.png

如理解有误,请指正

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档