使用Spring bean作为与@Cacheable注释的关键(Using Spring beans

2019-06-26 03:36发布

如何让下面的工作: - 一个Spring bean有应与@Cacheable注释被缓存的方法 - 又一春豆,对于缓存(KeyCreatorBean)创建密钥。

因此,代码看起来是这样的。

@Inject
private KeyCreatorBean keyCreatorBean;

@Cacheable(value = "cacheName", key = "{@keyCreatorBean.createKey, #p0}")
@Override
public List<Examples> getExamples(ExampleId exampleId) {
  ...

但是上面的代码不起作用:它提供了以下异常:

Caused by: org.springframework.expression.spel.SpelEvaluationException: 
    EL1057E:(pos 2): No bean resolver registered in the context to resolve access to bean 'keyCreatorBean'

Answer 1:

我检查底层的缓存分辨率执行,有没有出现是在一个注入一个简单的方法BeanResolver这是需要解决的豆类和评估般的表情@beanname.method

所以我也建议沿着@micfra建议之一线有点哈克的方式。

除了他所说的话,必须沿着这些线KeyCreatorBean,但是在内部它委托给您在申请注册的keycreatorBean:

package pkg.beans;

import org.springframework.stereotype.Repository;

public class KeyCreatorBean  implements ApplicationContextAware{
    private static ApplicationContext aCtx;
    public void setApplicationContext(ApplicationContext aCtx){
        KeyCreatorBean.aCtx = aCtx;
    }


    public static Object createKey(Object target, Method method, Object... params) {
        //store the bean somewhere..showing it like this purely to demonstrate..
        return aCtx.getBean("keyCreatorBean").createKey(target, method, params);
    }

}


Answer 2:

在你有一个静态类的功能的情况下,它会像这样

@Cacheable(value = "cacheName", key = "T(pkg.beans.KeyCreatorBean).createKey(#p0)")
@Override
public List<Examples> getExamples(ExampleId exampleId) {
  ...
}

package pkg.beans;

import org.springframework.stereotype.Repository;

public class KeyCreatorBean  {

    public static Object createKey(Object o) {
        return Integer.valueOf((o != null) ? o.hashCode() : 53);
    }

}


文章来源: Using Spring beans as a key with @Cacheable annotation