使用Spring以声明方式缓存bean方法的返回值

时间:2010-07-07 13:38:51

标签: java spring caching

我有几个用java @Configuration定义的bean。其中一些方法执行相当长的计算,我想缓存给定参数的返回值,以避免每次调用方法时都进行这些计算。

示例:

@Configuration public class Config {
    @Bean public CalculatorBean calcBean() {
        return new CalculatorBean();
    }
}

public class CalculatorBean {
    public int hugeCalculation(int arg1, String arg2, double[] arg3) {
        // ... very long calculation ...
    }
}

理想情况下,我想使用某种自定义@Bean@Configuration中注释@Cached(method="hugeCalculation", size=1000, ttl=36000)方法,并自动对bean工厂进行后处理以将这些bean包装在AOP代理中。< / p>

有这种现成的解决方案吗? 如果没有,我应该用什么类的Spring来做这个?

2 个答案:

答案 0 :(得分:2)

如果值确实不变,那么将CalculatorBean转换为FactoryBean会怎样?我不确定这对你的@Configuration有什么用处 - 我从未使用过那个注释。

您可以返回(例如)Integer.class,将其设为单身,然后使用getObject方法进行计算。如下所示:

public class CalculatorBean implements FactoryBean {
    public Object getObject() {
        return (Integer)hugeCalculation(...);
    }
    public Class getObjectType() {
        return Integer.class;
    }
    public boolean isSingleton() {
        return true;
    }
    private int hugeCalculation(int arg1, String arg2, double[] arg3) {
        // ... very long calculation ...
    }
}

答案 1 :(得分:0)

最后我最终使用了Ehcache,但在此之前我创建了以下解决方案:

  1. 我创建了一个从bean中检索BeanPostProcessor的{​​{1}}(在初始化之前或之后无关紧要)。
  2. BeanDefinition经过BeanDefinition,我检索了该getSource() - 注释方法的MethodMetadata
  3. 从MethodMetadata中我检索了方法的注释。
  4. 如果它们包含我的自定义@Bean注释,我将该bean包装在@Cached中,以我需要的方式缓存方法结果。
  5. 无论如何,Ehcache是​​一个更好的解决方案,它也有弹簧集成,但它需要注释需要缓存的实际方法。这意味着您无法有选择地缓存调用,但在大多数情况下,它不是必需的。