前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

@Cacheable是用来声明方法是可缓存的。将结果存储到缓存中以便后续使用相同参数调用时不需执行实际的方法。直接从缓存中取值。最简单的格式需要制定缓存名称。 
例如:

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

在上面的代码片段中,findBook方法与名为books的缓存想关联。每次调用该方法时,将在缓存中检查该请求是否已执行,以免重复执行。虽然在大多数情况下,只有一个缓存被声明,注释允许指定多个名称,以便使用多个缓存。这种情况下,在执行方法之前,每个缓存都会检查之前执行的方法,只要有一个缓存命中,即直接从缓存中返回相关的值。 
即使没有实际执行缓存方法,所有其他不包含该值的缓存也将被更新。 
例如:

@Cacheable({"books", "isbns"})
public Book findBook(ISBN isbn) {...}

默认key生成: 
默认key的生成按照以下规则: 
- 如果没有参数,则使用0作为key 
- 如果只有一个参数,使用该参数作为key 
- 如果又多个参数,使用包含所有参数的hashCode作为key

自定义key的生成: 
当目标方法参数有多个时,有些参数并不适合缓存逻辑 
比如:

@Cacheable("books")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

其中checkWarehouse,includeUsed并不适合当做缓存的key.针对这种情况,Cacheable 允许指定生成key的关键属性,并且支持支持SpringEL表达式。(推荐方法) 
再看一些例子:

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#map['bookid'].toString()")
public Book findBook(Map<String, Object> map)

缓存的同步 sync: 
在多线程环境下,某些操作可能使用相同参数同步调用。默认情况下,缓存不锁定任何资源,可能导致多次计算,而违反了缓存的目的。对于这些特定的情况,属性 sync 可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中。 
例:

@Cacheable(cacheNames="foos", sync="true")
public Foo executeExpensiveOperation(String id) {...}

属性condition: 
有时候,一个方法可能不适合一直缓存(例如:可能依赖于给定的参数)。属性condition支持这种功能,通过SpEL 表达式来指定可求值的boolean值,为true才会缓存(在方法执行之前进行评估)。 
例:

@Cacheable(cacheNames="book", condition="#name.length < 32")
public Book findBook(String name)

此外,还有一个unless 属性可以用来是决定是否添加到缓存。与condition不同的是,unless表达式是在方法调用之后进行评估的。如果返回false,才放入缓存(与condition相反)。 #result指返回值 例:

@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.name.length > 5"")
public Book findBook(String name)

@CachePut

如果缓存需要更新,且不干扰方法的执行,可以使用注解@CachePut。@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor)

注意:应该避免@CachePut 和 @Cacheable同时使用的情况。

@CacheEvict annotation

spring cache不仅支持将数据缓存,还支持将缓存数据删除。此过程经常用于从缓存中清除过期或未使用的数据。 
@CacheEvict要求指定一个或多个缓存,使之都受影响。此外,还提供了一个额外的参数allEntries 。表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素。

@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)

@CacheConfig

有时候一个类中可能会有多个缓存操作,而这些缓存操作可能是重复的。这个时候可以使用@CacheConfig

@CacheConfig("books")
public class BookRepositoryImpl implements BookRepository {@Cacheablepublic Book findBook(ISBN isbn) {...}
}

@CacheConfig是一个类级别的注解,允许共享缓存的名称、KeyGenerator、CacheManager 和CacheResolver。 
该操作会被覆盖。

开启缓存注解

java类配置:

@Configuration
@EnableCaching
public class AppConfig {
}

XML 配置:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:cache="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"><cache:annotation-driven /></beans>

spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict相关推荐

  1. spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict

    Cacheable CachePut CacheEvict annotation CacheConfig 开启缓存注解 @Cacheable @Cacheable是用来声明方法是可缓存的.将结果存储到 ...

  2. Spring Cache常用注解详解

    Spring Cache常用注解详解 @EnableCaching 开启Spring Cache框架支持.解析对应的注解,实现缓存读写访问 @CacheConfig 缓存配置,可以配置当前类型中所用缓 ...

  3. Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用

    前置知识: 在Spring Cache缓存中有两大组件CacheManager和Cache.在整个缓存中可以有多个CacheManager,他们负责管理他们里边的Cache.一个CacheManage ...

  4. 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓 ...

  5. cacheable更新_详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓 ...

  6. Spring : 缓存相关注解@EnableCaching、@CacheConfig、@Cacheable、@Caching

    1.美图 2.概述 缓存相关注解 解释 @EnableCaching 开启缓存注解的支持 @CacheConfig 用于统一制定一些配置参数,这样在其他缓存注解里面就不用重复指定 @Cacheable ...

  7. 详解Spring MVC请求参数类型,解决中文乱码问题,自定义类型转换器,Spring MVC相关注解

    #SpringMVC SpringMVC请求 简单类型 简单类型包括:基本类型,基本类型的包装类型,字符串 编写Controller @RequestMapping("/param" ...

  8. spring boot 相关注解

    spring boot是基于spring 开发的,因此,spring boot工程中可以使用spring 的注解.除了spring注解外,spring boot会使用到的注解有: @SpringBoo ...

  9. Spring Cache使用详解

    Spring Cache Spring Cache使用方法与Spring对事务管理的配置相似.Spring Cache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用 ...

最新文章

  1. ubuntu 14.04 使用apt-get出现如下问题解决办法
  2. 【MATLAB】二维矩阵可视化 MATLAB绘图
  3. asp.net读取模版并写入文本文件
  4. 好好说一说室内定位技术
  5. python语言的理解-初学Python语言者必须理解的下划线
  6. 韩寒:一个产品经理的自我修养
  7. MyBatis(三)——动态SQL
  8. 注解@Component方式代替xml装配bean
  9. 11.29 广州国际设计周
  10. HanLP的自定义词典使用方式与注意事项介绍
  11. 【转】VPP基本安装
  12. flask的请求与响应
  13. 学习通网络看课鼠标不能离开页面问题
  14. Python爬虫实战之爬取链家广州房价_04链家的模拟登录(记录)
  15. 海康威视-海康门禁设备对接SDK-已完成完整封装调用
  16. 第九周 项目一--猴子选大王(数组版)
  17. element-ui安装失败解决方法
  18. 《魔兽争霸》故事背景
  19. 《守望先锋》中的网络同步技术
  20. qq邮箱收信服务器imap,普通IMAP、POP邮箱的设置 教你使用iPhone邮件客户端管理QQ邮箱...

热门文章

  1. 【VSCode快捷键大合集】
  2. Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解
  3. 【 FZU - 2214 】Knapsack problem(逆向0-1背包)
  4. 【HDU - 5912】Fraction (模拟)
  5. 详解3D物体检测模型 SPG: Unsupervised Domain Adaptation for 3D Object Detection via Semantic Point Generation
  6. 2.Building Models from Convolutions
  7. 特殊mac地址文档_Mac颜值秒杀Win10?五款神器让Win10化身macOS
  8. c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...
  9. applicationContext.xml
  10. php长轮询阻塞,ajax长轮询时php被阻塞