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


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

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

SpringBoot|2021-08-06Spring @Cacheable注解的使用
文章图片

【SpringBoot|2021-08-06Spring @Cacheable注解的使用】
笔记 ------------------------

@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的缓存不生效
SpringBoot|2021-08-06Spring @Cacheable注解的使用
文章图片

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 = "https://www.it610.com/article/xx" ,keyGenerator = "myKeyGenerator")


    推荐阅读