首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过根据返回类型动态获取仙人掌名在通用方法上应用缓存的Spring缓存

通过根据返回类型动态获取仙人掌名在通用方法上应用缓存的Spring缓存
EN

Stack Overflow用户
提问于 2022-03-07 05:41:02
回答 1查看 325关注 0票数 0

方法getById位于名为AbstractCachedResult的抽象类中。

代码语言:javascript
代码运行次数:0
运行
复制
public abstract class AbstractCachedResult<T extends BaseResource> {

    @Cacheable(value = "dynamicName")
    public T getById(String id){
      //program logic
    }
}

许多其他服务类将从这个类继承。前任:

代码语言:javascript
代码运行次数:0
运行
复制
public class UserService extends AbstractCachedResult<User> {
    
    //program logic
}

因为我在抽象类中设置了@Cacheable(value = "dynamicName"),所以我无法知道方法返回的类的类型。我需要能够动态地获取类的名称,以便在每次从继承的类调用方法时使用正确的缓存。

我遇到了另一个帖子。在这里,它们将实体类名作为参数传递,我无法这样做。我需要动态地获取返回数据的类型,以便我们可以使用@Caching注释,这是#2解决方案。有办法这样做吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-08 18:55:31

可以说,最简单和最明显的解决方案,尤其是对于维护人员来说,应该是重写子类中的getById(:String)方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
public class UserService extends AbstractCachedResult<User> {

    @Cacheable("UserCache")
    public User getById(String id) {
        super.id(id);
    }

    // additional logic
}

或者,您可以实现一个“自定义”CacheResolver (参见文档Javadoc),它能够检查(目标)子类的类通用签名。

最后,在底层用Spring实现了Spring的缓存抽象.对于真正的低级别控件,应该可以编写自定义的AOP拦截器,这与Spring的默认CacheInterceptor (Javadoc)没有什么不同。如果需要的话,您自己的AOP建议甚至可以相对于可缓存的建议进行排序。

老实说,我认为我上面提到的第一个选择是最好的方法。并不是每个服务类都需要缓存getById(:String)操作的结果。缓存实际上取决于数据的事务性质和数据更改的频率。

用你最好的判断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71376837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档