您可以编写自己的方面,始终创建返回值的副本,这将使您独立于某些 Ehcache 设置。
起初,像@CopyReturnValue
这样的标记注释可以很好地表达切入点:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CopyReturnValue {
}
现在,切面可以将此注解用于切入点表达式:
@Aspect
@Component
public class CopyReturnValueAspect {
@Around("@annotation(CopyReturnValue)")
public Object doCopyReturnValue(ProceedingJoinPoint pjp) throws Throwable {
Object retVal = pjp.proceed();
Object copy = BeanUtils.cloneBean(retVal); // create a copy in some way
return copy;
}
}
最后,将注释添加到您的方法中:
@CopyReturnValue
@Cacheable("cache")
public MyObject getObj(Object param);
对于CopyReturnValueAspect
我BeanUtils
用来创建返回值的副本 - 仅作为示例。有关该主题的更多信息,您可能需要查看如何将属性从一个 Java bean 复制到另一个?
哦,别忘了在 Spring 配置中启用 @AspectJ 支持(如果您还没有的话):
<aop:aspectj-autoproxy />