1、简介:
Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用Cache(JSR-107)注解简化我们开发;
Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache,ConcurrentMapCache等;
每次调用需要缓存功能的方法时,Spring会检查指定参数的指定目标方法是否已经被调用过了;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
使用Spring抽象缓存时我们需要注意:
1、确定方法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据
2、注解
实现步骤
1、需要在启动类上添加@EnableCaching注解,表示使用Spring抽象缓存
@SpringBootApplication
@EnableCaching
public class SpringBootWebRestfulcrudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebRestfulcrudApplication.class, args);
}
}
2、注解都在service层
@Service
//@CacheConfig(cacheNames = "employee") //定义全局的注解value
public class EmployeeServiceImpl implements EmployeeService {
@Resource
EmployeeMapper employeeMapper;
@Cacheable(cacheNames = {"employee"},key = "'all'")
@Override
public List<Employee> findEmployeeAll() {
System.out.println("开始查询全部");
return employeeMapper.findEmployeeAll();
}
/**
* @Cacheable:进行缓存
* @Cacheable的几个属性:
* cacheNames/value:指定缓存组件的名字;将方法的返回结果放入缓存中,是数组的方式,可以指定多个缓存
* key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值
* keyGenerator:key的生成器;可以自己指定key的生成器的组件id
* key/keyGenerator二选一使用
* cacheManager:指定缓存管理器,或者cacheResolver指定获取解析器
* condition:指定符合条件的情况下才缓存
* unless:否定缓存,当unless指定的条件为true,方法的换回值就不会被缓存,可以获取到结果进行判断
* sync:是否使用异步模式
* @return
*/
//如果需要自定义key格式为 key = "'名称'"
@Cacheable(cacheNames = {"employee"},key = "#employeeId")
@Override
public Employee findEmployeeId(Integer employeeId) {
System.out.println("------开始缓存-------");
return employeeMapper.findEmployeeId(employeeId);
}
/**
* @CachePut:既调用方法也更新缓存数据
* 原理:先更新内容,然后把结果更新缓存
* 要指定好key
* @param employee
* @return
*/
@CachePut(value = "employee",key = "#employee.employeeId")
@Override
public Employee updateEmployee(Employee employee) {
employeeMapper.updateEmployee(employee);
return employee;
}
/**
* 缓存清除
* key:指定要清除的数据
* allEntries = true:指定清除这个缓存中的所有数据
* beforeInvocation = false:缓存的清除是否在方法之前执行
* @param employeeId
* @return
*/
@CacheEvict(value = "employee",key="'all'")
@Override
public int deleteEmployee(Integer employeeId) {
return employeeMapper.deleteEmployee(employeeId);
}
/**
* 组合注解:定义复杂类型
* @Caching(
* cacheable = {@Cacheable(cacheNames = {"employee"},key = "#employeeId")},
* put = {
* @CachePut(value = "employee",key = "#employee.employeeId"),
* @CachePut(value = "employee",key = "#employee.employeeId")
* })
*/
}