2011-11-03 71 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)

希望這會有所幫助。