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