2012-11-14 40 views
2

我有需要的DTO,並返回結果的一些服務:@Caching隨着多個按鍵

@Override 
public int foo(Bar bar) { 
    .... 
} 

酒吧如下(簡化):

public class Bar { 
    public int id; 
    public String name; 
    public String baz; 

    @Override 
    public int hashCode() { 
     //this is already being defined for something else 
     ... 
    } 

    @Override 
    public boolean equals(Object o) { 
     //this is already being defined for something else 
     ... 
    } 
} 

我想用@Cacheable關於foo方法;然而,我想散列在id和name屬性上,但不是baz。有沒有辦法做到這一點?

回答

6

是的,你可以指定使用Spring的EL表達式沿着這些線路:

@Override 
@Cacheable(key="#bar.name.concat('-').concat(#bar.id)") 
public int foo(Bar bar) { 
    .... 
} 

或酒吧定義修改的hashCode和調用:

@Override 
@Cacheable(key="#bar.hashCodeWithIdName") 
public int foo(Bar bar) { 
    .... 
} 
0

@Biju和@vsingh的答案都是正確的;但如果您試圖緩存的Bar對象很複雜,或者foo方法包含大量使用SpEL的參數可能不是用於生成密鑰的最理想解決方案,那麼我想再添加一個替代方案。您也可以考慮使用keyGenerator

例子:

@Override 
@Cacheable(value="barCahceKey", keyGenerator="barKeyGenerator") 
public int foo(Bar bar) { 
    .... 
} 

@Component 
public class BarKeyGenerator implements KeyGenerator { 
@Override 
public Object generate(Object o, Method method, Object... objects) { 
     // TODO logic to generate unique key 
     return "Bar_Key_Generator_With_Params_etc"; 
    } 
} 

用這種方法你的關鍵是如何構建完全的靈活性。

KeyGenerator API