1、常用注解

  • Cache:缓存注解,在Controller的方法上使用,用于缓存此方法的返回值

  • CacheEvictor:清理缓存注解,在Controller的方法上使用,用于清理指定缓存数据

  • CacheMethodInterceptor:缓存拦截器,用于拦截加入缓存相关注解的Controller方法

  • AbstractCacheAnnotationProcessor:抽象缓存注解处理器,为缓存操作提供一些公共方法

  • CachesAnnotationProcessor:缓存注解处理器,当Controller的方法上加入Cache注解时由此处理器进行缓存处理

  • CacheEvictorAnnotationProcessor:失效缓存注解处理器,当Controller的方法上加入CacheEvictor注解时由此处理器进行缓存失效处理

  • EnableCache:开启缓存功能注解,一般在项目的启动类上使用,用于开启缓存功能

2、注解实现方式

1. @Documented – 表示使用该注解的元素应被javadoc或类似工具文档化,它应用于类型声明,类型声明的注解会影响客户端对注解元素的使用。
如果一个类型声明添加了Documented注解,那么它的注解会成为被注解元素的公共API的一部分。
2. @Target – 表示支持注解的程序元素的种类,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,
那么该注解就可以使用在任何程序元素之上。
3. @Inherited – 表示一个注解类型会被自动继承,如果用户在类声明的时候查询注解类型,同时类声明中也没有这个类型的注解,
那么注解类型会自动查询该类的父类,这个过程将会不停地重复,直到该类型的注解被找到为止,或是到达类结构的顶层(Object)。
4. @Retention – 表示注解类型保留时间的长短,它接收RetentionPolicy参数,可能的值有SOURCE, CLASS, 以及RUNTIME。

3、定义缓存注解实现方式

package com.itheima.j2cache.annotation;
import java.lang.annotation.*;
​
/**
 * 缓存注解
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Cache {
    String region() default "rx";
    String key() default "";
    String params() default "";
}
​
package com.itheima.j2cache.annotation;
import java.lang.annotation.*;
​
/**
 * 失效缓存
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheEvictor {
    Cache[] value() default {};
}

4、Controller层应用对照上面3的两种缓存

    @GetMapping("detail/{id}")
    @Cache(region = "addressBook", key = "ab",params = "id")
    public AddressBook detail(@PathVariable(name = "id") String id){
        // 如果缓存中没有,通过地址簿服务根据id查询
        AddressBook addressBook = addressBookService.getById(id);
        // 返回查询到的地址簿信息
        return addressBook;
    }
    @DeleteMapping("/{id}")
    @CacheEvictor({@Cache(region = "addressBook", key = "ab",params = "id")})
    public Result del(@PathVariable(name = "id") String id){
        // 调用地址簿服务的删除方法,尝试根据id删除地址簿信息
        boolean result = addressBookService.removeById(id);
        // 如果删除成功,则从缓存中移除相应的数据
        if (result){
            //cacheChannel.evict(region, id);
            // 返回操作成功的提示结果
            return Result.ok();
        }
        // 返回操作失败的提示结果
        return Result.error();
    }