在某些代码中,有一个带弹簧可缓存注释的接口方法。我有一个类的装饰器正在改变这个方法。代码基本上是
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
注释不是可用选项。
答案 0 :(得分:2)
@Cacheable
具有条件缓存功能(请参阅35.3.1 Conditional caching)。条件参数采用SpEL表达式。
interface Foo {
@Cacheable(condition = "doCache")
Widget doit(boolean doCache);
}
可以使用doCache
参数(或更优雅的SpEL)来控制缓存。类型可以匹配foo instanceof T(Bar)
。
希望这有帮助。