美文网首页
spring-cache -KeyGenerator自定义

spring-cache -KeyGenerator自定义

作者: AmeeLove | 来源:发表于2018-04-25 16:40 被阅读5137次

    接口KeyGenerator

    image.png

    要实现自定义,要实现spring提供的接口KeyGenerator
    package org.springframework.cache.interceptor;

    helper

    • fastjson
    
    public class JsonHelper {
    
    
        /**
         * Java对象序列化为JSON字符串
         *
         * @param obj Java对象
         * @return json字符串
         */
        public static String toJson(Object obj) {
            return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);
        }
    }
    
    
    • beanHelper
    package com.ghgcn.mysb.chapter03.helper;
    
    import org.springframework.util.ClassUtils;
    
    import java.net.URI;
    import java.net.URL;
    import java.util.Date;
    import java.util.Locale;
    
    public class BeanHelper {
        /**
         * 判断是否是简单值类型.包括:基础数据类型、CharSequence、Number、Date、URL、URI、Locale、Class;
         *
         * @param clazz
         * @return
         */
        public static boolean isSimpleValueType(Class<?> clazz) {
            return (ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() || CharSequence.class.isAssignableFrom(clazz)
                    || Number.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz) || URI.class == clazz
                    || URL.class == clazz || Locale.class == clazz || Class.class == clazz);
        }
    }
    
    

    SpringCacheKeyGenerator

    package com.ghgcn.mysb.chapter03.support;
    
    import com.ghgcn.mysb.chapter03.helper.BeanHelper;
    import com.ghgcn.mysb.chapter03.helper.JsonHelper;
    import org.springframework.cache.interceptor.KeyGenerator;
    
    import java.lang.reflect.Method;
    @Component //标记为组件
    public class SpringCacheKeyGenerator implements KeyGenerator {
    
        private final static int NO_PARAM_KEY = 0;
        private String keyPrefix = "jf";// key前缀,用于区分不同项目的缓存,建议每个项目单独设置
    
    
    
        @Override
        public Object generate(Object target, Method method, Object... params) {
    
            char sp = ':';
            StringBuilder strBuilder = new StringBuilder(30);
            strBuilder.append(keyPrefix);
            strBuilder.append(sp);
            // 类名
            strBuilder.append(target.getClass().getSimpleName());
            strBuilder.append(sp);
            // 方法名
            strBuilder.append(method.getName());
            strBuilder.append(sp);
            if (params.length > 0) {
                // 参数值
                for (Object object : params) {
                    if (BeanHelper.isSimpleValueType(object.getClass())) {
                        strBuilder.append(object);
                    } else {
                        strBuilder.append(JsonHelper.toJson(object).hashCode());
                    }
                }
            } else {
                strBuilder.append(NO_PARAM_KEY);
            }
            return strBuilder.toString();
        }
    
    
    
        public String getKeyPrefix() {
            return keyPrefix;
        }
    
        public void setKeyPrefix(String keyPrefix) {
            this.keyPrefix = keyPrefix;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:spring-cache -KeyGenerator自定义

          本文链接:https://www.haomeiwen.com/subject/orsylftx.html