2011-11-03 74 views
2

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

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然后第一次高兴地返回修改后的小部件。

在第二呼叫弹簧看到的Foo.doit()调用(这实际上是FooDecorator.doit())并返回它已经高速缓存的对象(它们是不正确地从StandardFoo.doit()的值)。

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

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

回答

2

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

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

doCache参数(或一些更优雅的SpEL)可用于控制缓存。类型可以匹配,如foo instanceof T(Bar)

希望这会有所帮助。