如下代码, 看似没问题,但是却没能成功缓存,为什么呢?
@Override
public List<OfflineBaseInfo> getAllJobBaseInfo(String station,boolean skipInvalidJob) {
List<String> jobs=getOfflineBaseJobs();
List<OfflineBaseInfo> ret=new ArrayList<>();
ArrayUtil.subListByCount(jobs,30,(subJobs)->{
ret.addAll(getBaseInfoByJobs(station,subJobs,true));
});
return ret;
}
@Override
@Cacheable(value="getBaseInfoByJobs",key="#station+'-'+#jobList")
public List<OfflineBaseInfo> getBaseInfoByJobs(String station,List<String> jobList,boolean skipInvalidJob) {
原因就是在一个service实例里面, method a 直接调用method b, 它会直接调用自身的method b而不是经过aop拦截后的method b , 所以所有注解都失效.
所以, 应该修改method a,并传入一个service实例(被spring包装过, aop拦截过), 然后在method a里面用service.methodb的方法来调用本service的其他方法, 方可让method b的注解生效,如下代码:
@Override
public List<OfflineBaseInfo> getAllJobBaseInfo(OfflineService service,String station,boolean skipInvalidJob) {
List<String> jobs=service.getOfflineBaseJobs();
List<OfflineBaseInfo> ret=new ArrayList<>();
ArrayUtil.subListByCount(jobs,30,(subJobs)->{
ret.addAll(service.getBaseInfoByJobs(station,subJobs,true));
});
return ret;
}