Cacheable使用SpEL自定义key


4个月前 292次点击 来自 后端

标签: SpringBoot

本地缓存一般用于外部数据源访问,Restful API调用,可重用的复杂计算等类型函数,以下是具体使用中使用SpEL自定义key的几个方式:

1. 简单引用

@Cacheable(key="#id")
public Object method(Integer id);

2. 组合引用

@Cacheable(key="T(String).valueOf(#name).concat('_').concat(#age)")
public Object method(String name,Integer age);

3. 对象引用

@Cacheable(key="#user.id")
public Object method(User user);

4.自定义Key生成器

@Cacheable(keyGenerator = "myKeyGenerator")
public Object method(User user);

Spring Cache默认使用SimpleKeyGenerator生成器,它只使用方法名参数进行合成key。
默认缓存key策略 ,cacheNames为注解中定义的缓存前缀,两个分号固定:

  • 单参数:cacheNames::arg
  • 无参数: cacheNames::SimpleKey [], 后面使用 SimpleKey []来补齐
  • 多参数: cacheNames::SimpleKey [arg1, arg2...]
  • 非基础对象:cacheNames::obj.toString()
public class SimpleKeyGenerator implements KeyGenerator {

	@Override
	public Object generate(Object target, Method method, Object... params) {
		return generateKey(params);
	}

	/**
	 * Generate a key based on the specified parameters.
	 */
	public static Object generateKey(Object... params) {
		if (params.length == 0) {
			return SimpleKey.EMPTY;
		}
		if (params.length == 1) {
			Object param = params[0];
			if (param != null && !param.getClass().isArray()) {
				return param;
			}
		}
		return new SimpleKey(params);
	}

}

自定义一个简单的生成器,生成规则是 方法名 + 参数

public class MyKeyGenerator implements KeyGenerator {

	@Override
	public Object generate(Object target, Method method, Object... params) {
		return  return method.getName()+"["+ Arrays.asList(params).toString()+"]";
	}
}

Made with in Shangrao,China By Devler.

Copyright © Devler 2012 - 2022

赣ICP备19009883号-1

Top ↑