@Cacheable,@CacheConfig(cacheNames = "menus_cache")有什么用,怎么用
时间: 2024-05-13 13:15:44 浏览: 137
`@Cacheable` 和 `@CacheConfig` 都是 Spring Framework 提供的用于支持缓存的注解。
`@Cacheable` 用于标注在方法上,表示该方法的返回结果可以被缓存起来,下次调用该方法时,如果缓存中存在该结果,则直接返回缓存中的结果,而不会执行该方法。`@Cacheable` 注解有以下几个常用属性:
- `value` 或 `cacheNames`:指定缓存的名称,可以指定多个,用 `,` 分隔;
- `key`:指定缓存的 key,可以使用 SpEL 表达式;
- `condition`:指定缓存的条件,可以使用 SpEL 表达式;
- `unless`:指定缓存不应该被存储的条件,可以使用 SpEL 表达式;
- `sync`:指定是否使用异步模式缓存结果,缺省为 false。
`@CacheConfig` 用于配置缓存的公共属性,可以标注在类上或接口上,表示该类或接口中所有使用 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解时,缺省的缓存名称和缓存管理器。`@CacheConfig` 注解有以下属性:
- `cacheNames`:指定缓存的名称,可以指定多个,用 `,` 分隔;
- `cacheManager`:指定缓存管理器的名称;
- `keyGenerator`:指定缓存 key 的生成器;
- `cacheResolver`:指定缓存解析器;
- `condition`:指定缓存的条件,可以使用 SpEL 表达式;
- `unless`:指定缓存不应该被存储的条件,可以使用 SpEL 表达式。
使用示例:
```java
@CacheConfig(cacheNames = "menus_cache")
@Service
public class MenuServiceImpl implements MenuService {
@Autowired
private MenuRepository menuRepository;
@Cacheable
@Override
public List<Menu> findAll() {
return menuRepository.findAll();
}
@Cacheable(key = "#id")
@Override
public Menu findById(Long id) {
return menuRepository.findById(id).orElse(null);
}
@CachePut(key = "#menu.id")
@Override
public Menu save(Menu menu) {
return menuRepository.save(menu);
}
@CacheEvict(key = "#id")
@Override
public void deleteById(Long id) {
menuRepository.deleteById(id);
}
@CacheEvict(allEntries = true)
@Override
public void clearCache() {
// 清空缓存
}
}
```
在上面的示例中,`@CacheConfig(cacheNames = "menus_cache")` 指定了缓存的名称为 `menus_cache`,因此在 `@Cacheable`、`@CachePut`、`@CacheEvict` 注解中不需要再指定缓存名称。`@Cacheable` 注解用于缓存 `findAll()` 和 `findById()` 方法的返回结果,`@CachePut` 注解用于更新 `save()` 方法的返回结果,`@CacheEvict` 注解用于删除 `deleteById()` 方法的返回结果,`clearCache()` 方法则用于清空缓存。这样,每次调用这些方法时,如果缓存中已经存在结果,则直接返回缓存中的结果,否则执行方法并将结果缓存起来。
阅读全文