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 |