我们如何在java中实现方法缓存

时间:2015-07-17 14:11:55

标签: java spring-aop

我想设计自己的注释,以便缓存从早期数据库调用中检索到的结果。

例如:

public class CountryService {
 @MethodCache
 public List<Country> getCountries();

 @MethodCache
 public Country getCountryById(int countryId);

 @InvalidateMethodCache
 public Country getCountryById(int countryId);

}

我想对我的更多/所有方法使用这种类型的注释。我需要什么来实现这种类型的注释?

@MethodCache:缓存方法结果。
@InvalidateMethodCache:清除缓存。

4 个答案:

答案 0 :(得分:2)

使用spring-aop时的解决方案是创建一个方面来处理使用自定义注释注释的所有方法。粗略的实现看起来像这样:

Map<String, Object> methodCache = new HahsMap<>();

@Around("execution(@(@com.mypack.MethodCache *) *)")
public Object cacheMethod(ProceedingJoinPoint pjp) {
     String cacheKey = getCacheKey(pjp);
     if ( methodCache.get(cacheKey)) {
          return methodCache.get(cacheKey);
     } else {
          Object result = pjp.proceed();
          methodCache.put(cacheKey, result);
          return result;
     }
}

private String getCacheKey(ProceedingJoinPoint pjp) {
     return pjp.getSignature().toString() + pjp.getTarget() + Arrays.asList(pjp.getArgs());
}

答案 1 :(得分:2)

如果有准备好的注释,那么最好使用它们
虽然你可以遵循这个,但我希望这能指导你

  • 实施界面 CacheAnnotationParser
  • 扩展 AnnotationCacheOperationSource ,以便在内部解析器集合中添加自己的 CacheAnnotationParser 以及Spring one
  • 定义自定义 AnnotationCacheOperationSource 以使用与Spring相同的ID,因此它将覆盖Spring内部。如果id匹配,它应该干净地覆盖Spring。

    喜欢这个

<强>

答案 2 :(得分:2)

我已实施此功能,并在GITHUB上传了我的项目。

示例:

public class CountryService {

    @MethodCache

    public List<Country> getCountries();


    @MethodCache

    public Country getCountryById(int countryId);

    @InvalidateMethodCache

    public Country deleteCountryByID(int countryId);

  }

答案 3 :(得分:0)

我使用spring / java实现了方法缓存..

https://github.com/vikashnitk50/spring-application-caching/