以下作品(执行驱逐的结果):
fooController {
@ApiEndpoint
public delete(id) {
fooService.deleteFoo(id)
}
}
fooService {
@CacheEvict(value = "cache1", key = "#id")
public void deleteFoo(Long id) {
//delete logic here
}
}
但这不起作用(没有任何东西从缓存中逐出):
fooController {
@ApiEndpoint
public delete(name) {
fooService.deleteFoo2(name)
}
}
fooService {
public void deleteFoo2(String name) {
//delete logic here
deleteFoo(name.getId())
}
@CacheEvict(value = "cache1", key = "#id")
public void deleteFoo(Long id) {
//delete logic here
}
}
为什么只在从控制器直接调用方法时才调用@CacheEvict注释?
我使用Redis作为缓存机制。
答案 0 :(得分:1)
当你在课堂内调用你的方法时,Aop并没有动摇。 当方法被另一个类调用时,它正在工作。 所以你可以在另一个服务中定义deleteFoo。
答案 1 :(得分:0)
要使 spring 方面拦截 @Cache*
注释,您必须进行外部调用。如果您不喜欢从另一个对象调用此方法,请使用 bean 自调用 方法。在这种情况下,您的类显示为两个对象,一个调用另一个:
@Resource private FooController thisBean;
public delete(id) {
thisBean.deleteFoo(id)
}
@CacheEvict(value = "cache1", key = "#id")
public void deleteFoo(Long id) {}