此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

基于 XML 的声明性缓存

如果注释不是一种选择(可能是由于无法访问源代码) 或没有外部代码),您可以使用 XML 进行声明性缓存。因此,而不是 注释缓存方法时,您可以指定目标方法和 缓存指令(类似于声明式事务管理建议)。示例 可以翻译成以下示例:spring-doc.cadn.net.cn

<!-- 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设置为可缓存。缓存语义 要应用,则封装在cache:advice定义,这会导致findBooks用于将数据放入缓存的方法和loadBooks驱逐方法 数据。这两个定义都不利于books缓存。spring-doc.cadn.net.cn

aop:configdefinition 将缓存通知应用于 使用 AspectJ 切入点表达式进行编程(更多信息可在 Spring 面向方面编程中找到)。在前面的示例中, 所有方法BookService被考虑并应用缓存通知。spring-doc.cadn.net.cn

声明性 XML 缓存支持所有基于注释的模型,因此在 两者应该相当容易。此外,两者都可以在同一应用程序中使用。 基于 XML 的方法不触及目标代码。然而,它本质上是更多的 详细。处理具有重载方法的类时,这些方法针对 缓存,确定正确的方法确实需要额外的努力,因为method论证不是一个好的鉴别器。在这些情况下,您可以使用 AspectJ 切入点 挑选目标方法并应用适当的缓存功能。 但是,通过 XML,可以更轻松地应用包或组或接口范围的缓存 (同样,由于 AspectJ 切入点)并创建类似模板的定义(就像我们所做的那样) 在前面的示例中,通过cache:definitions cache属性)。spring-doc.cadn.net.cn