防止特定类的Spring缓存

时间:2011-11-03 18:08:03

标签: java spring caching ehcache

在某些代码中,有一个带弹簧可缓存注释的接口方法。我有一个类的装饰器正在改变这个方法。代码基本上是

interface Foo {
  @Cacheable
  Widget doit();
}

class StandardFoo implements Foo {
   public Widget doit();
}

class FooDecorator implements Foo {
  Foo decorated;

  public Widget doit() {
    Widget = decorated.doit();
    ..some fun stuff
    return new SlightlyDifferentWidget();
  }
}

我的问题来自于在调用链中调用装饰器,然后调用装饰对象。然后Spring(或Ehcache)决定缓存由修饰实例返回的对象。 FooDecorator然后第一次愉快地返回修改过的小部件。

在第二次调用时,Spring看到Foo.doit()(实际上是FooDecorator.doit())的调用并返回它已缓存的对象(这些对象来自StandardFoo.doit())。

所以我想做的是在某处添加配置,告诉Spring / Ehcache只缓存来自DecoratedFoo的值,或者不缓存其他实现返回的值。

请注意,从界面中删除@Cacheable注释不是可用选项。

1 个答案:

答案 0 :(得分:2)

@Cacheable具有条件缓存功能(请参阅35.3.1 Conditional caching)。条件参数采用SpEL表达式。

interface Foo {
    @Cacheable(condition = "doCache")
    Widget doit(boolean doCache);
}

可以使用doCache参数(或更优雅的SpEL)来控制缓存。类型可以匹配foo instanceof T(Bar)

希望这有帮助。