Spring缓存抽象

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")
     *     })
     */

}

猜你喜欢

转载自blog.csdn.net/javaasd/article/details/114154302