springboot2 缓存抽象(二)ConcurrentMapCache及缓存注解讲解

一、导入pom
<!-- 引入cache -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

二、开启缓存
 @EnableCaching //开启缓存,可在任何自动配置类上注解
@SpringBootApplication
public class SpringbootMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisApplication.class, args);
    }

}
三、程序如下

1、controller层

@RestController
public class PersonController {
     @Autowired
    private PersonService personService;

    @GetMapping("/person/{id}") 
    public Person getAll(@PathVariable("id") Integer id){
        return personService.selectByid(id);
    }

    @GetMapping("/person")
    public Person updatePerson(Person person) {
      return personService.updatePerson(person);
    }

    @RequestMapping("/deleteperson/{id}")
    public boolean deletePerson(@PathVariable(value = "id") Integer id){
        return personService.deletePerson(id);
    }

}

2、service层 相关注解及参数,请 点击

@Service
//设置进入该service的cacheManager或者cacheResolve都一样效果,也可以设置在方法上
@CacheConfig(cacheNames = "person"/*, cacheManager = "personCacheManager",keyGenerator = "myKeyGenerator"*/)
public class PersonService {

    @Autowired
    private PersonMapper personMapper;
//key默认就是参数名;unless设置不使用缓存的条件;condition设置符合条件的就执行缓存
//unless = "#a0 >1"(第一個參數大于1), condition = "#root.args[0] != 3"(第一个参数不能为3)
    @Cacheable(key = "#id", unless = "#a0 >1", condition = "#root.args[0] != 3")
    public Person selectByid(Integer id) {
        Person person = personMapper.getByid(id);
        System.out.println("获取到person为" + person);
        return person;
    }

    @CachePut(key = "#result.id")//结果的id,设置缓存方法不能使用#result.id
    public Person updatePerson(Person person) {
        personMapper.update(person);
        System.out.println("已更新為" + person );
        return person;

    }

    @CacheEvict(key = "#id")//参数的值
    public boolean deletePerson(Integer id) {
        personMapper.delect(id);
        System.out.println("已清空緩存信息" + id);
        return true;
    }
}

四、自定义键生成策略
@Configuration
public class MyCacheConfig {

    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){

            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+"["+ Arrays.asList(params).toString()+"]";
            }
        };
    }
}

运行流程:

*   @Cacheable:
* 1、方法运行之前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取;
*    (CacheManager先获取相应的缓存),第一次获取缓存如果没有Cache组件会自动创建。
* 2、去Cache中查找缓存的内容,使用一个key,默认就是方法的参数;
*      key是按照某种策略生成的;默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key;
*         SimpleKeyGenerator生成key的默认策略;
*              如果没有参数;key=new SimpleKey()*              如果有一个参数:key=参数的值
*              如果有多个参数:key=new SimpleKey(params)* 3、没有查到缓存就调用目标方法;
* 4、将目标方法返回的结果,放进缓存中

你可能感兴趣的:(spring)