Spring缓存,实例变量和参数作为键

时间:2014-02-25 15:49:00

标签: java spring ehcache spring-cache

我正在使用ehcache来缓存方法结果。键必须是成员对象和方法参数的组合。我的课看起来像:

Class A {

private B b;

@Cacheable(value="someCache",key="some key based on B and C")
public Result getResult(C c){
......
}

我需要基于B和C的密钥。 我提到https://code.google.com/p/ehcache-spring-annotations/issues/detail?id=69但他们没有指定如何在密钥生成中包含method参数。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

您可以使用密钥中的A访问root.target对象。 e.g。

key="#root.target.b.id+'-'+#c.id"

答案 1 :(得分:0)

我已经实现了一个自定义密钥生成器来解决这个问题。我仍然认为这可以通过ehcache解决,而无需使用自定义密钥生成器。但我无法在任何地方得到答案。请参阅下面的答案:

@Component
public class Home {

    private Parameter param;

    @Cacheable(cacheName = "homeCache", 
                    keyGenerator = @KeyGenerator(name = "com.myapp.cache.Home.ParamKeyGenerator"))

    public Result getPerson(Person p) {

        //Do something with p
        return result;
    }

    public Parameter getParam() {

        return param;
    }

    public void setParam(Parameter param) {

        this.param = param;
    }

    public static class ParamKeyGenerator implements CacheKeyGenerator<Serializable> {

        public Serializable generateKey(MethodInvocation methodInvocation) {

            Object[] obj = methodInvocation.getArguments();
            Home h = (Home) methodInvocation.getThis();

            return this.generateKey(obj[0], h.getParam());
        }

        public Serializable generateKey(Object... data) {

            String key = ((Person) data[0]).getName() + ((Parameter) data[1]).getName();
            System.out.println("generating key: " + key);
            return key;
        }
    }
}