我可以在没有注释的情况下使用Spring的缓存功能吗?

时间:2012-08-07 21:21:36

标签: spring caching configuration annotations ehcache

我正在开发一个我正计划使用Spring's declarative caching来处理的模块。我使用缓存

编写了许多方法
@Override
@Cacheable("businessUnitCache")
public BusinessUnit getBusinessUnit(String businessUnitId){

我计划提供一个类路径bean文件和类路径eh-cache configuration来提供功能,而不需要消耗项目来了解我的实现的内部以及需要缓存哪些方法(许多这些方法他们从来没有直接访问 )。

然而,阅读问题Using Spring cache annotation in multiple modules及其答案显然会导致问题是任何消费项目也使用Spring缓存注释。如果没有声明的缓存匹配注释,我希望Sprint会无声地失败,但它会因错误而失败:

  

java.lang.IllegalArgumentException:无法为CacheableOperation找到名为[businessUnitCache]的缓存[public

引导我得出结论我不能使用缓存注释(这与我在Is it possible to use multiple ehcache.xml (in different projects, same war)?问题中的原始结论相冲突。我的测试支持了这一点。

所以:是否可以单独从实现类声明缓存,最好是在xml中?这将允许我使用缓存规则准备一个附加文件,并使用替换缓存管理器名称标准弹簧属性替换(我已经在做与数据源类似的事情)?不幸的是,refernece documentation仅描述了基于注释的配置。

1 个答案:

答案 0 :(得分:3)

您可以使用xml文件配置缓存,请参阅spring参考手册:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/cache.html#cache-declarative-xml

<!-- the service we want to make cacheable -->
<bean id="bookService" class="x.y.service.DefaultBookService"/>

<!-- cache definitions -->
<cache:advice id="cacheAdvice" cache-manager="cacheManager">
<cache:caching cache="books">
    <cache:cacheable method="findBook" key="#isbn"/>
    <cache:cache-evict method="loadBooks" all-entries="true"/>
</cache:caching>
</cache:advice>  

<!-- apply the cacheable behaviour to all BookService interfaces -->
<aop:config>
<aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.BookService.*(..))"/>
</aop:config>