将实例字段设为缓存键?

时间:2016-03-31 12:52:54

标签: java spring spring-cache

我使用org.springframework.cache.annotation.Cacheable进行方法级缓存

public class Customer {

private Long id;

@Cacheable("customer",key="this.id")
public CustomerAddress findCustomerAddress() {...}

}

我想用key作为id来缓存客户对象。但我没有id作为方法参数。我把它作为实例字段?

1 个答案:

答案 0 :(得分:0)

你不能轻易做到这一点,上面的代码有两个气味IMO:

  • 您正尝试在address缓存
  • 中缓存customer
  • 您尝试缓存的对象似乎没有自己的标识。然后你宁可缓存Customer(有一个)而不是子组件

您已经对原始问题发表了很好的评论,我建议您查看当前的设计,以便缓存的对象具有自己的标识。如果你不能或不愿意,总有办法。

@Cacheable(cacheNames = "customer", keyGenerator="customerKeyGenerator")
public CustomerAddress findCustomerAddress() {...}

}

然后在某些@Configuration

@Bean
public KeyGenerator customerKeyGenerator() {

}

KeyGenerator的API非常简单。例如,您可以检查目标实例是否为Customer,然后检索id值。