@Cacheable(cacheNames = Constant.CACHE_COMMODITY, key = "#goodsCode+'_'+#sysOrgCode", unless = "#result==null")
时间: 2023-03-04 20:45:22 浏览: 74
It looks like you have provided a partial code snippet. Can you please provide more information about the context in which this code is being used and what you would like me to help you with?
相关问题
@Cacheable,@CacheConfig(cacheNames = "menus_cache")有什么用,怎么用
`@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()` 方法则用于清空缓存。这样,每次调用这些方法时,如果缓存中已经存在结果,则直接返回缓存中的结果,否则执行方法并将结果缓存起来。
解释一下这段代码@Transactional( propagation = Propagation.NOT_SUPPORTED ) @Cacheable( value = {"dict-item"}, key = "#dictCode+'&'+#itemCode" )
这段代码使用了两个注解:@Transactional和@Cacheable。
@Transactional注解表示该方法需要在一个事务中运行。它的属性propagation指定了事务的传播机制,PROPAGATION.NOT_SUPPORTED表示不支持事务。也就是说,这个方法不会被包含在当前的事务之内。
@Cacheable注解表示该方法的计算结果可以缓存。它的value属性指定了缓存的名称,key属性指定了缓存的key。这里用了字面值"dict-item"作为缓存名称,用了一个空字符串作为缓存的key。如果方法的参数或返回值可以用作缓存的key,也可以直接在key属性中使用#号加上参数名或返回值的属性名。
总之,这段代码的作用是执行一个不支持事务的方法,如果这个方法的计算结果存在缓存中,则直接返回缓存值,否则执行方法并将结果存入缓存中。