java - 如何在 Spring 3.1 中从多个参数生成自定义键以进行缓存抽象?

标签 java spring caching key

Spring documentation给出了如何从参数之一计算自定义 key 的示例:

@Cacheable(value="book", key="isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

但是,如果我需要根据多个参数计算 key 怎么办?例如在

@Cacheable(value="book", key="???")
public Book findBook(String author, String title,
                     boolean checkWarehouse, boolean includeUsed)

我如何从authortitle计算 key ?到目前为止,我想出了丑陋的解决方案,例如

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)"。但它仍然远非优雅。

(在我看来,如果@CacheableString[] key而不是String key,那就更容易了。对于默认键,Spring 无论如何都必须将多个哈希合并为一个。)

最佳答案

如果您使用的是 JDK 1.7,您可能可以执行以下操作:

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

关于java - 如何在 Spring 3.1 中从多个参数生成自定义键以进行缓存抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607279/

相关文章:

java - 如何在 Hibernate 实体注释上使用两个外键作为主键

java - 谷歌云消息或 XMPP

java - Spring SpEL 有限制吗?

mysql - 如何迭代优化 MySQL 查询?

Java的默认接口(interface)方法与私有(private)实例方法冲突?

java - TCP - JAVA - 如何在本地网络上查找服务器?

java - Spring 启动 : testing paged results using TestRestTemplate

java - Maven 安装构建错误 - 依赖项路径

apache - 指定静态文件缓存的到期日期

c# - 附有堆转储的 Fluent Nhibernate 内存泄漏