使用@CacheResult时如何对参数调用静态方法?
解决@CacheResult中调用静态方法生成缓存Key的问题
你完全可以在@CacheResult注解中通过key属性使用SpEL表达式来调用静态方法,和@Cacheable的写法几乎一致——因为Spring Cache对这两个注解的SpEL支持是同源的。
具体实现方式
直接在@CacheResult的key参数里编写包含静态方法调用的SpEL表达式即可,语法和你用@Cacheable时完全一样:
@CacheResult(cacheName = "myCache", key = "{#id, #name, T(my.static).method(#date)}") public Result search(long id, String name, Date date);
原理说明
Spring Cache的注解(包括@CacheResult和@Cacheable)都支持通过SpEL表达式来定义缓存Key。其中:
T()语法用于引用静态类,建议使用完整类路径避免运行时解析歧义#参数名用于直接引用方法的入参- 你可以像在
@Cacheable里一样,组合多个参数、调用静态方法甚至执行更复杂的逻辑来生成Key
进阶方案:自定义KeyGenerator
如果你的Key生成逻辑比较复杂,或者需要在多个方法中复用,也可以自定义KeyGenerator,然后在@CacheResult的keyGenerator属性中指定:
// 自定义KeyGenerator组件 @Component("customSearchKeyGenerator") public class CustomSearchKeyGenerator implements KeyGenerator { @Override public Object generate(Object target, Method method, Object... params) { long id = (long) params[0]; String name = (String) params[1]; Date date = (Date) params[2]; // 调用静态方法处理date参数 Object processedDate = MyStaticClass.method(date); // 返回组合后的Key return Arrays.asList(id, name, processedDate); } } // 使用自定义KeyGenerator的@CacheResult @CacheResult(cacheName = "myCache", keyGenerator = "customSearchKeyGenerator") public Result search(long id, String name, Date date);
这样两种方式都能实现你想要的效果,简单逻辑用SpEL直接写在注解里更直观,复杂逻辑用自定义KeyGenerator更利于维护和复用。
内容的提问来源于stack exchange,提问作者Younes HAJJI
相关产品推荐
相关产品推荐

