spring cache中的key生成实现

349

spring cache中的keyGenerator实现

方法缓存中参数有很多,网上有很多key值都是存一个参数,导致参数为多个的情况,参数变化下缓存并不会刷新。解决方案就是重写spring cache的默认key实现方式,通过类名,方法名以及参数值得方式来生成key值

@Configuration("CacheManager")
@EnableCaching
public class J2CacheSpring
		extends CachingConfigurerSupport
{
	protected Logger logger = LoggerFactory.getLogger(getClass());

	@Override public CacheManager cacheManager()
	{
		J2CacheConfig config = null;
		try
		{
			config = J2CacheConfig.initFromConfig("/j2cache/j2cache.properties");
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		// 生成 J2CacheBuilder
		J2CacheBuilder j2CacheBuilder = J2CacheBuilder.init(config);
		// 构建适配器
		J2CacheSpringCacheManageAdapter j2CacheSpringCacheManageAdapter = new J2CacheSpringCacheManageAdapter(
				j2CacheBuilder, true);

		return j2CacheSpringCacheManageAdapter;
	}
//自定义key生成实现
	@Override
	public KeyGenerator keyGenerator()
	{
		logger.info("缓存key值生成");
		return new KeyGenerator(){
			@Override
			public Object generate(Object o, Method method, Object... objects) {
				StringBuilder sb = new StringBuilder("Cache:BaseService");
				sb.append(":");
				sb.append(o.getClass().getName().toString());
				sb.append(":");
				sb.append(method.getName().toString());

				StringBuilder s = new StringBuilder();
				for (Object obj : objects) {
					if (Objects.nonNull(obj)){
						s.append(obj.toString());
					}
				}
				sb.append(":");
				sb.append(SecureUtil.md5(s.toString()));
				return sb.toString();
			}
		};
	}
}