Java 如何从Spring3.1中缓存抽象的多个参数生成自定义键?

Java 如何从Spring3.1中缓存抽象的多个参数生成自定义键?,java,spring,caching,key,Java,Spring,Caching,Key,给出一个示例,说明如何从其中一个参数计算自定义键: @Cacheable(value="book", key="isbn") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) 但是,如果我需要从几个参数计算密钥呢?例如在 @Cacheable(value="book", key="???") public Book findBook(String author, String title,

给出一个示例,说明如何从其中一个参数计算自定义键:

@Cacheable(value="book", key="isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
但是,如果我需要从几个参数计算密钥呢?例如在

@Cacheable(value="book", key="???")
public Book findBook(String author, String title,
                     boolean checkWarehouse, boolean includeUsed)
如何从
作者
标题
计算密钥?
到目前为止,我提出了一些丑陋的解决方案,如

author.hashCode() + 31 * title.hashCode()
或者我可以创建一个外部助手函数,如

public static int hashes(Object... args) {
    return java.util.Arrays(args).asList().hashCode();
}
并像
key=“T(mypackage.MyHelperClass.hashes(author,title)”
那样调用它。但它仍然很不优雅


(在我看来,如果
@Cacheable
使用
String[/code>键而不是
String键
,就更容易了。对于默认键,Spring必须将多个哈希组合成一个。)

@Cacheable(value="book", key="T(java.util.Objects).hash(#p0,#p1)")
public Book findBook(String author, String title,
                     boolean checkWarehouse, boolean includeUsed)

密钥不是散列!不要使用Objects.hash或类似内容创建密钥。 看看javadoc


对于您的情况,请使用字段、多参数构造函数创建类ComplexKey,并为此字段生成hashCode和equals

您可以在key中使用所有SpEL特性,比如“#author+'-'+#title”,我认为这是唯一的enough@hoaz好主意。在这个例子中,作者和标题不太可能重叠,这似乎很合理。但是,如果对象没有有意义和唯一的字符串表示,它将不起作用。正如我说过的,SpEL足够丰富,可以做任何需要提供唯一性的事情,对于您当前的问题,这个简单的键将起作用