【问题标题】:Use multiple annotations on a method and pass the data在一个方法上使用多个注解并传递数据
【发布时间】:2015-04-08 08:25:06
【问题描述】:
我的方法上有两个注释:
@Profiled(tag = "XXX") ( // provided by perf4j
@Cacheable(unless="takesLong") // provided by spring
public String cacheResultsIfTakesLong() {
我的目标是仅在执行时间超过指定时间时才缓存cacheResultsIfTakesLong 方法的结果。
有没有办法传递在处理@Profiled 注释期间计算的执行时间,以用于“除非”属性?
【问题讨论】:
标签:
spring
caching
annotations
【解决方案1】:
我怀疑是否有任何现成的解决方案可用于检索方法执行时间。您可以做的是将一个附加参数传递给该方法并在方法结束时更新该参数。这个参数可以用来判断是否需要缓存结果。
@Profiled(tag = "XXX") ( // provided by perf4j
@Cacheable(unless="(#timeTaken.get('key') < 1000)") // provided by spring
public String cacheResultsIfTakesLong(method_args..., Map timeTaken) {
long startTime = ...;
//method logic
long endTime = ...;
timeTaken.put("key", endTime - startTime);
}
【解决方案2】:
我不确定您是否可以使用注释来执行此操作,因为您需要先运行该方法以获取时间,然后再决定条件缓存。
或者,您也可以不使用注释,例如:
@Autowired private CacheManager cacheManager;
public String cacheResultsIfTakesLong(String key) {
String value = cacheManager.getCache("cacheResultsIfTakesLong").get(key);
if(value == null){
StopWatch stopWatch = new StopWatch();
value = ... run your query ...
stopWatch.stop("XXX");
if(stopWatch.getElapsedTime() > takesLong)
cacheManager.getCache("cacheResultsIfTakesLong").put(key,value);
}
return value;
}