我们如何在 java 中实现方法缓存
How do we implement method cache in java
我想设计自己的注释,以便缓存从较早的数据库调用中检索到的结果。
例如:
public class CountryService {
@MethodCache
public List<Country> getCountries();
@MethodCache
public Country getCountryById(int countryId);
@InvalidateMethodCache
public Country getCountryById(int countryId);
}
我想为我的 more/all 个方法使用这种类型的注释。我需要什么来实现这种类型的注解?
@MethodCache: 缓存方法结果。
@InvalidateMethodCache:清除缓存。
使用 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());
}
好吧,如果有可用的注释,最好使用它们
虽然您可以按照此操作,但我希望它能为您提供指导
- 实现接口CacheAnnotationParser
- 扩展 AnnotationCacheOperationSource 以便除了 Spring 内部解析器集合 CacheAnnotationParser 28=]
- 定义您的自定义 AnnotationCacheOperationSource 使用与 Spring 相同的 id,因此它将覆盖 Spring 内部。如果 id 匹配,它应该完全覆盖 Spring 一个。
像这样:
我已经使用 spring/java..
实现了方法缓存
我已经实现了此功能并在 GITHUB 中上传了我的项目。
示例:
public class CountryService {
@MethodCache
public List<Country> getCountries();
@MethodCache
public Country getCountryById(int countryId);
@InvalidateMethodCache
public Country deleteCountryByID(int countryId);
}
我想设计自己的注释,以便缓存从较早的数据库调用中检索到的结果。
例如:
public class CountryService {
@MethodCache
public List<Country> getCountries();
@MethodCache
public Country getCountryById(int countryId);
@InvalidateMethodCache
public Country getCountryById(int countryId);
}
我想为我的 more/all 个方法使用这种类型的注释。我需要什么来实现这种类型的注解?
@MethodCache: 缓存方法结果。
@InvalidateMethodCache:清除缓存。
使用 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());
}
好吧,如果有可用的注释,最好使用它们
虽然您可以按照此操作,但我希望它能为您提供指导
- 实现接口CacheAnnotationParser
- 扩展 AnnotationCacheOperationSource 以便除了 Spring 内部解析器集合 CacheAnnotationParser 28=]
- 定义您的自定义 AnnotationCacheOperationSource 使用与 Spring 相同的 id,因此它将覆盖 Spring 内部。如果 id 匹配,它应该完全覆盖 Spring 一个。
像这样:
我已经使用 spring/java..
实现了方法缓存我已经实现了此功能并在 GITHUB 中上传了我的项目。
示例:
public class CountryService {
@MethodCache
public List<Country> getCountries();
@MethodCache
public Country getCountryById(int countryId);
@InvalidateMethodCache
public Country deleteCountryByID(int countryId);
}