【发布时间】:2015-05-10 15:12:19
【问题描述】:
我已经看到了一些使用 AspectJ 实现方法结果缓存的实现。例如,jcabi-aspects 或某些older examples 中的一个。
这个想法是,而不是编写用于缓存字段中方法结果的样板代码,如下所示:
public Mesh someComplexGeometry() {
if (this.geometry == null) {
this.geometry = computeTheGeometry();
}
return this.geometry;
}
我们注释方法,以便 AspectJ 编译器更改它们的字节码,以便它们的结果在第一次执行后存储在某个地方并在连续执行时检索:
@Cacheable
public Mesh someComplextGeometry() {
// just compute the mesh, very neat and clear
}
我担心的是,我看到的所有缓存方面的实现都是基于将值存储在Map 中。它还涉及为这些映射构造键的相当复杂的过程。恐怕这会对性能产生一些影响。
我认为,如果有一个方面以这种方式工作,那将是理想的:对于带有 @Cacheable 注释的类的每个 n 方法,添加一个字段 private Object cache_n 到那个类,然后在第一次方法调用时将结果存储在一个字段中,而不是在 Map 中,然后在连续的方法调用中继续返回字段内容。
所以想法是在编织期间为每个带注释的方法注入自定义私有字段,而不是使用整个胖 Map。但我无法弄清楚如何做到这一点,以及是否有可能。
以下方面实现了我想要的,但仅适用于类只有一个用@Cached注释的方法的情况:
public aspect Cacher {
private Object cache;
pointcut cached(): execution(@Cached * * (..));
Object around(): cached() {
if (cache == null) {
cache = proceed();
}
return cache;
}
}
我可以用 AspectJ 做那种缓存吗?如果我不能,是否有任何平台限制不允许这样的事情,或者它只是没有在 AspectJ 语言中实现?
【问题讨论】: