方法getById
位于名为AbstractCachedResult
的抽象类中。
public abstract class AbstractCachedResult<T extends BaseResource> {
@Cacheable(value = "dynamicName")
public T getById(String id){
//program logic
}
}
许多其他服务类将从这个类继承。前任:
public class UserService extends AbstractCachedResult<User> {
//program logic
}
因为我在抽象类中设置了@Cacheable(value = "dynamicName")
,所以我无法知道方法返回的类的类型。我需要能够动态地获取类的名称,以便在每次从继承的类调用方法时使用正确的缓存。
我遇到了另一个帖子。在这里,它们将实体类名作为参数传递,我无法这样做。我需要动态地获取返回数据的类型,以便我们可以使用@Caching注释,这是#2解决方案。有办法这样做吗?
发布于 2022-03-08 10:55:31
可以说,最简单和最明显的解决方案,尤其是对于维护人员来说,应该是重写子类中的getById(:String)
方法,如下所示:
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)
操作的结果。缓存实际上取决于数据的事务性质和数据更改的频率。
用你最好的判断。
https://stackoverflow.com/questions/71376837
复制相似问题