SpringBoot缓存

(1)、使用@EnableCaching注解开启基于注解的缓存

 1 package cn.coreqi;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.cache.annotation.EnableCaching;
 6 
 7 @SpringBootApplication
 8 @EnableCaching  //开启基于注解的缓存
 9 public class SpringbootjdbcApplication {
10 
11     public static void main(String[] args) {
12         SpringApplication.run(SpringbootjdbcApplication.class, args);
13     }
14 
15 }

(2)、对使用缓存的方法添加缓存注解

 1 package cn.coreqi.service;
 2 
 3 import cn.coreqi.dao.UserRepository;
 4 import cn.coreqi.entities.User;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.cache.annotation.*;
 7 import org.springframework.stereotype.Service;
 8 
 9 import java.util.List;
10 import java.util.Optional;
11 
12 @Service
13 //@CacheConfig(cacheNames = "user")   //抽取缓存的公共配置
14 //可以使用@Caching注解在方法上运用多个缓存注解
15 public class UserService {
16     @Autowired
17     private UserRepository userRepository;
18 
19     public User addUser(User user){
20         return userRepository.save(user);
21     }
22 
23     /**
24      * @CachePut:调用方法并同步更新缓存,修改了数据库的某个数据同时更新缓存
25      * 运行流程
26      *  1.先调用目标方法
27      *  2.将运行结果缓存起来并同步更新缓存
28      * @CachePut的Key可以使用#result拿到运行结果
29      * @param user
30      * @return
31      */
32     @CachePut(cacheNames = "user",key = "#result.Id")
33     public User modifyUser(User user){
34         return userRepository.save(user);
35     }
36     public List<User> getList(){
37         return userRepository.findAll();
38     }
39 
40     /**
41      * @Cacheable标注的方法在执行之前先来检查缓存中有没有这个数据,如果没有就运行方法并将结果放入缓存
42      * 默认按照参数的值作为Key去查询缓存
43      * 几个重要属性:
44      *  cacheNames/value:指定当前缓存所在Cache组件的名称
45      *  key:缓存数据使用的Key,默认是方法的入参和返回值组合,Key支持SpEL表达式
46      *  keyGenerator:Key的生成器,可以自己指定Key的生成策略(key和keyGenerator二选一)
47      *  cacheManager:指定缓存管理器,或者cacheResolver指定缓存解析器
48      *  condition:指定符合条件的情况下才缓存数据
49      *  unless:否定缓存,当unless指定的条件为True的情况下方法的返回值就不会被缓存,可以利用获取到的结果进行判断
50      *  sync:是否使用异步模式
51      * @param id
52      * @return
53      */
54     @Cacheable(cacheNames = "user")
55     public User getById(Integer id){
56         System.out.println("查询数据Id:" + id);
57         Optional<User> user =  userRepository.findById(id);
58         return user.get();
59     }
60 
61     /**
62      * @CacheEvict:清除缓存
63      * 几个重要属性:
64      *  key:指定要清除数据的Key
65      *  allEntries:是否清除这个缓存中所有缓存数据
66      *  beforeInvocation:缓存的清除是否在方法运行之前执行,默认False
67      * @param id
68      */
69     @CacheEvict(cacheNames = "user",key = "#id")
70     public void delById(Integer id){
71         userRepository.deleteById(id);
72     }
73 }

 

*缓存支持的SpEL表达式

描述 示例
当前被调用的方法名
#root.methodName
当前被调用的方法
#root.method.name
当前被调用的目标对象
#root.target
当前被调用的目标对象类
#root.targetClass
当前被调用的方法的参数
#root.args[0]

当前方法调用使用的缓存列表

(如@cacheable(value={"cache1","cache2"}),则有两个cache)

#root.caches[0].name
方法参数的名字,可以直接#参数名称,也可以使用#p0的形式,0代表参数索引
#Id、#users0
方法执行后的返回值(仅当方法执行之后的判断有效,如“unless”,“cachePut”的表达式,“cacheEvict的表达式”,beforeInvocation=false)  
#result
posted @ 2019-02-03 18:21  SpringCore  阅读(232)  评论(0编辑  收藏  举报