深入理解春天缓存框架

  

本文是缓存系列第三篇,前两篇分别介绍了番石榴和JetCache。

  

前两篇我们讲了番石榴和JetCache,它们都是缓存的具体实现,今天给大家分析一春天下框架本身对这些缓存具体实现的支持和融合。使用弹簧缓存将大大的减少我们的春天项目中缓存使用的复杂度,提高代码可读性。本文将从以下几个方面来认识春天缓存框架。

  

<强>背景
  

  

SpringCache产生的背景其实与春天产生的背景有点类似。由于Java EE系统框架臃肿,低效,代码可观性低,对象创建和依赖关系复杂,春天框架出来了,目前基本上所有的Java后台项目都离不开弹簧或SpringBoot(对Spring的进一步简化)。现在项目面临高并发的问题越来越多,各类缓存的应用也增多,那么在通用的弹簧框架上,就需要有一种更加便捷简单的方式,来完成缓存的支持,就这样SpringCache就出现了。

  

不过首先我们需要明白的一点是,SpringCache并非某一种缓存实现的技术,SpringCache是一种缓存实现的通用技术,基于春天提供的缓存框架,让开发者更容易将自己的缓存实现高效便捷的嵌入到自己的项目中。当然,SpringCache也提供了本身的简单实现NoOpCacheManager, ConcurrentMapCacheManager等。通过SpringCache,可以快速嵌入自己的缓存实现。

  

<强>用法
  

  

源码已分享至Github: https://github.com/zhuzhenke/common-caches

  

<强>注意点:
  

  

1,开启EnableCaching注解,默认没有开启缓存。
  

  

2,配置缓存管理器。
  

        @ bean   @ qualifier (“concurrentMapCacheManager”)   @Primary   ConcurrentMapCacheManager ConcurrentMapCacheManager () {   返回新ConcurrentMapCacheManager ();   }   之前      

这里使用了@Primary和@ qualifier注解,@ qualifier注解是给这个豆加一个名字,用于同一个接口Bean的多个实现时,指定当前Bean的名字,也就意味着缓存管理器可以配置多个,并且在不同的方法场景下使用.@Primary注解是当接口豆有多个时,优先注入当前Bean。

  

现在拿CategoryService实现来分析。

        公开课CategoryService {      @Caching(驱逐={@CacheEvict (value=https://www.yisu.com/zixun/CategoryCacheConstants.CATEGORY_DOMAIN   关键=" # category.getCategoryCacheKey ()”,   beforeInvocation=true)})   公共int添加(类别分类){   System.out.println(“模拟进行数据库交互操作……”);   system . out。println(缓存成为无效的值:+ CategoryCacheConstants.CATEGORY_DOMAIN   +”键:“+ category.getCategoryCacheKey ());   返回1;   }      @Caching(驱逐={@CacheEvict (value=https://www.yisu.com/zixun/CategoryCacheConstants.CATEGORY_DOMAIN   关键=" # category.getCategoryCacheKey ()”,   beforeInvocation=true)})   公共int删除(类别分类){   System.out.println(“模拟进行数据库交互操作……”);   system . out。println(缓存成为无效的值:+ CategoryCacheConstants.CATEGORY_DOMAIN   +”键:“+ category.getCategoryCacheKey ());   返回0;   }      @Caching(驱逐={@CacheEvict (value=https://www.yisu.com/zixun/CategoryCacheConstants.CATEGORY_DOMAIN   关键=" # category.getCategoryCacheKey ()”)})   公共int更新(类别分类){   System.out.println(“模拟进行数据库交互操作……”);   system . out。println(缓存更新值:+ CategoryCacheConstants.CATEGORY_DOMAIN   +”键:“+ category.getCategoryCacheKey ()   +”、类别:“+类别);   返回1;   }      @Cacheable(值=https://www.yisu.com/zixun/CategoryCacheConstants.CATEGORY_DOMAIN   关键=" # category.getCategoryCacheKey ()”)   公共类别(类别分类){   System.out.println(“模拟进行数据库交互操作……”);   该分类的结果=();   result.setCateId (category.getCateId ());   result.setCateName (category.getCateId () +“CateName”);   result.setParentId (category.getCateId () - 10);   返回结果;   }   }      之前      

CategoryService通过对类别对象的数据库增删改查,模拟缓存失效和缓存增加的结果。使用非常简便,把注解加在方法上,则可以达到缓存的生效和失效方案。

  

<强>深入源码
  

  

源码分析我们分为几个方面一步一步解释其中的实现原理和实现细节。源码基4.3.7于春天。释放分析。

  

<>强发现
  

  

SpringCache在方法上使用注解发挥缓存的作用,缓存的发现是基于AOP的切入点和MethodMatcher通过在注入的类中找到每个方法上的注解,并解析出来。

深入理解春天缓存框架