Spring @Cacheable 的key生成

原创
2019/11/29 14:22
阅读数 962
@Cacheable(value="users", key="#id")

 key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们这里先来看看自定义策略,至于默认策略会在后文单独介绍。
 1. 自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。

   @Cacheable(value="users", key="#id")
   public User find(Integer id) {
      return null;
   }

   @Cacheable(value="users", key="#p0")
   public User find(Integer id) {
      return null;
   }

   @Cacheable(value="users", key="#user.id")
   public User find(User user) {
      return null;
   }

   @Cacheable(value="users", key="#p0.id")
   public User find(User user) {
      return null;
   }

2.除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息。

  当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性:

   @Cacheable(value={"users", "xxx"}, key="caches[1].name")
   public User find(User user) {
      return null;
   }

如果要调用当前类里面的方法:


    @RequestMapping(value = "/dept/data")
    @ResponseBody
    @Cacheable(value = "echartDeptDataCache", key = "#root.target.getFormatKey()", unless = "#result == null")
    public Map<String, Object> deptChartData() {
    return null;
}
 /**
     * 生成key - echartDeptDataCache
     *
     * @param
     * @return
     */
    public String getFormatKey() {
        return ShiroUtils.getLoginName() + "echartDeptDataCache";
    }

划重点:要调用的方法要是public的。

展开阅读全文
打赏
1
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
1
分享
返回顶部
顶部