java - 如何防止缓存的返回值在spring可缓存中被更改

标签 java spring caching ehcache

我正在使用 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/

相关文章:

java - 如何在manyToMany字段中实现 View ?

java - 在类中实现静态方法

java - SAX 解析器 - OutOfMemoryError : Java heap space

java - 如何使用spring data jpa查询没有主键的表

java - 如果另一个用户登录,预身份验证不起作用 - Spring 安全

caching - 如何配置Dynacache CacheProvider?

.net - AppFabric 1.1 缓存(导致 Windows 服务崩溃)

.net - 是否可以连接到 WCF 缓存提供程序?

java - 如何在 ant 的 build.xml 中设置 -Dfile.encoding?

java - Android 游戏循环 : How to reach an average of 60 FPS?