我正在使用 ehcache 作为缓存实现来解决 spring 3.1 注释缓存。
具有这样的返回值的方法
@Cacheable("cache")
public MyObject getObj(Object param);
我第一次得到一个myobject返回值,并且它是可编辑的。 ehcache 可以通过设置“copyOnRead”或“copyOnWrite”来做到这一点。 它将强制在读/写时序列化对象。 但第一次spring不会从缓存中获取值,它总是通过方法本身返回。
有什么方法可以获取只读返回值吗?
最佳答案
您可以编写自己的方面,始终创建返回值的副本,这将使您独立于某些 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
创建返回值的副本 - 仅作为示例。有关该主题的更多信息,您可能需要查看 How to copy properties from one Java bean to another?
哦,如果您还没有启用 @AspectJ 支持,请不要忘记在 Spring 配置中启用:
<aop:aspectj-autoproxy />
关于java - 如何防止缓存的返回值在spring可缓存中被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10827267/