2021-08-06Spring @Cacheable注解的使用

@Cacheable是基于注解的缓存技术在Spring 3.1被引入


1、缓存存在哪?2、为什么注解未生效?3、自定义KeyGenerator 生成键

2021-08-06Spring @Cacheable注解的使用_第1张图片

笔记 ------------------------

@Inherited是一个标识,用来修饰注解

Class clazz = Sub.class;
//获取自身的注解。如果父类加@Inherited修饰,则获取的只是自身的注解和父类的注解
Arrays.toString(clazz.getAnnotations());    

注解加在某个类A上时,假如类B继承了A,则B也会带上该注解。 

@AliasFor("cacheNames")
String[] value() default {};

@AliasFor("value")
String[] cacheNames() default {};

任意设置value或者设置cacheNames属性的值,都能够通过另一个属性来获取值等等。
为了统一处理这些情况,Spring创建了@AliasFor标签。
1、缓存存在哪?

   缓存会存在redis里,默认的key是value设置的值。
 
2、为什么添加了@Cacheable,请求数据时没有缓存数据。

因为一个方法A调同一个类里的另一个有缓存注解的方法B,这样B是不走缓存的。
因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法,这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理,不会走代理,就不能正常创建缓存。

如:请求test()就只有a的缓存,b的缓存不生效

2021-08-06Spring @Cacheable注解的使用_第2张图片     

 3、自定义KeyGenerator 生成键

 SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指定 key 属性的情况下,默认使用 SimpleKeyGenerator 生成 key。除此之外,我们也可以自定义实现 KeyGenerator 接口,生成自己的 key 名称策略。

需要注册到spring
@Bean
public CustomKeyGenerator customKeyGenerator() {
    return new CustomKeyGenerator();
}
import com.alibaba.fastjson.JSONObject;
import org.springframework.cache.interceptor.KeyGenerator;
import java.lang.reflect.Method;
import java.util.StringJoiner;

/**
 * 自定义redis键生成器
 */
@SuppressWarnings("NullableProblems")
public class CustomKeyGenerator implements KeyGenerator {
    private static final String prefix = "CACHEABLE:";

    @Override
    public Object generate(Object o, Method method, Object... objects) {
        StringJoiner joiner = new StringJoiner(":", prefix, "");
        //类名
        joiner.add(o.getClass().getSimpleName());
        //方法名
        joiner.add(method.getName());
        //方法参数
        for (Object param : objects) {
            joiner.add(JSONObject.toJSONString(param));
        }
        return joiner.toString();
    }

}
//使用
@Cacheable(value = "xx" ,keyGenerator = "myKeyGenerator")

你可能感兴趣的:(SpringBoot,java,hibernate,spring)