从同一类的另一个方法调用缓存方法时,Spring cache不起作用。
这里有一个例子可以清楚地解释我的问题。
缓存服务类:
class testServiceImpl{
@CachePut(key = "#result.id", condition = "#result != null")
public List<String> create(String input) {
......
}
@CacheEvict(key="#id")
public void deleteById(Long id) {
.....
}
public void multiDelete(String input) {
if(condition...){
deleteById(2); //Cache is not Evicted here i.e. the records are still present in getAll call but not in Database.
}else{
create(input); //New Data is persisted in DB but the same has not been updated in Cache.
}
@Transactional
@Cacheable
public Map<Long, String> getAll() {
...
}
我也尝试过使用以下解决方案,但没有成功。
//Create a new object of the same class and use the same. In this case, the data is not persisted in DB i.e. it is not deleting the data from DB.
testServiceImpl testService;
...
public void multiDelete(String input) {
if(condition...){
testService.deleteById(2);
}else{
testService.create(input);
}
有人能帮我解决这个问题吗?
当您从服务调用方法时,您实际上是通过代理调用它。自动生成的bean包装在一个代理中,该代理拦截调用并仅处理该方法的缓存注释。
当您在内部进行调用时,它直接在服务对象上进行,没有代理包装器,缓存注释不会被处理。请参阅理解AOP代理
一个可行的替代方案是使用A人书J,它将处理缓存注释的Spring方面直接编织到代码中,而不使用任何Spring代理,因此您可以调用内部方法,缓存注释将按预期处理。