我有几个用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来做这个?
答案 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,但在此之前我创建了以下解决方案:
BeanPostProcessor
的{{1}}(在初始化之前或之后无关紧要)。BeanDefinition
经过BeanDefinition
,我检索了该getSource()
- 注释方法的MethodMetadata
。@Bean
注释,我将该bean包装在@Cached
中,以我需要的方式缓存方法结果。无论如何,Ehcache是一个更好的解决方案,它也有弹簧集成,但它需要注释需要缓存的实际方法。这意味着您无法有选择地缓存调用,但在大多数情况下,它不是必需的。