基于 XML 的声明式缓存
如果注释不是一个选项(可能是由于无法访问源 或没有外部代码),您可以使用 XML 进行声明式缓存。所以,而不是 对缓存方法进行注释时,您可以指定 Target 方法和 在外部缓存指令(类似于声明式事务管理建议)。示例 上一节可以翻译成以下示例:
<!-- 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 behavior to all BookService interfaces -->
<aop:config>
<aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.BookService.*(..))"/>
</aop:config>
<!-- cache manager definition omitted -->
在前面的配置中,bookService
设置为可缓存。缓存语义
to apply 封装在cache:advice
定义,这会导致findBooks
方法将数据放入缓存中,而loadBooks
驱逐方法
数据。这两个定义都与books
缓存。
这aop:config
定义将缓存建议应用于
使用 AspectJ 切入点表达式编程(更多信息可在 Aspect Oriented Programming with Spring 中找到)。在前面的示例中,
所有方法都来自BookService
被考虑,并将缓存建议应用于它们。
声明式 XML 缓存支持所有基于注释的模型,因此在
这两者应该相当容易。此外,两者都可以在同一个应用程序中使用。
基于 XML 的方法不会触及目标代码。然而,它本质上更多
详细。当处理具有针对
缓存时,确定正确的方法确实需要额外的努力,因为method
argument 不是一个好的鉴别器。在这些情况下,您可以使用 AspectJ 切入点
择优选择目标方法并应用适当的缓存功能。
但是,通过 XML,可以更轻松地应用包或组或接口范围的缓存
(同样,由于 AspectJ 切入点)并创建类似模板的定义(就像我们所做的那样
在前面的示例中,通过cache:definitions
cache
属性)。