@Cacheable(cacheNames = Constant.CACHE_COMMODITY, key = "#goodsCode+'_'+#sysOrgCode", unless = "#result==null")
时间: 2023-03-04 07:45:22 浏览: 109
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?
相关问题
解释一下这段代码@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属性中使用#号加上参数名或返回值的属性名。
总之,这段代码的作用是执行一个不支持事务的方法,如果这个方法的计算结果存在缓存中,则直接返回缓存值,否则执行方法并将结果存入缓存中。
@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()` 方法则用于清空缓存。这样,每次调用这些方法时,如果缓存中已经存在结果,则直接返回缓存中的结果,否则执行方法并将结果缓存起来。
阅读全文