当前位置: 首页 > 知识库问答 >
问题:

基于泛型方法的Spring MVC@Cacheable注释

董权
2023-03-14

通用方法

    // getAllById
@SuppressWarnings("unchecked")
public <T> List<T> getAllById(Class<T> entityClass, long id)
        throws DataAccessException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass)
            .add(Restrictions.eq("id", id));

    return criteria.list();
}

内部控制器

List<GenCurrencyModel> currencyList=pt.getAllById(GenCurrencyModel.class,1);

问题

我们如何在Generic方法中使用@Cacheable("abc")注释,并使用通用DAO的Spring mvc hibernate按需销毁缓存

根据SpringDoc中的示例,它指定了简单方法上的注释!

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

我实际上要求,当Id传递给泛型方法时,它应该首先在缓存中查找,我也应该按需销毁缓存!

共有1个答案

单展
2023-03-14

首先思考一下使用泛型的含义:

  • 您不知道将来将使用哪种类型。你也不知道缓存的名称

最后一点可以通过始终提供类型信息来解决,如方法中的entityClass

使用一个缓存并根据类型生成一个键。@Cacheable(value="myCache", key="#entityClass.name#id")

虽然您可以为键使用表达式,但不能将它们用于缓存名称。@缓存允许您使用多个@可缓存注释,每个注释都有另一个缓存名称。

@Caching (
@Cacheable(value="books", key="#id", condition="#entityClass.name == 'Book'"),
@Cacheable(value="students", key="#id", condition="#entityClass.name == 'Student')
)

这不是一个很大的努力去做。Spring默认缓存提供程序毕竟只是一个映射。您的实现可以为每种类型使用不同的“子缓存”。

清除缓存比较困难。解决方案1和3只有一个缓存。你不能只清除“书”,而不清除“学生”。解决方案2有这个选项,但是你必须提供所有可能的缓存和类型。您可以使用解决方案3,直接与缓存对话,而不是使用@CacheEvket

 类似资料:
  • 我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的

  • 本文向大家介绍SpringMVC基于注解的Controller详解,包括了SpringMVC基于注解的Controller详解的使用技巧和注意事项,需要的朋友参考一下 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能。现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和

  • 问题内容: 我希望能够自动连接单例bean() 由另一个单例方法()创建 使用xml就是。我该如何使用注释? 问题答案: 尝试使用Java :

  • 我正在尝试使用Enunciate为我的REST API生成静态文档,该API是使用Spring MVC 3.2用Java编写的。Enuncite网站声称,它通过使用以下特定插件来支持Spring: http://enunciate.codehaus.org/module_spring_app.html 在查看配置选项时,看起来我应该导入一个spring applicationContext.xml

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个