|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
基于声明式 XML 的缓存
如果无法使用注解(可能由于没有源代码的访问权限或没有外部代码),可以使用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 -->
在前面的配置中,bookService 被设置为可缓存。要应用的缓存语义封装在 cache:advice 定义中,这会导致 findBooks 方法用于将数据放入缓存,而 loadBooks 方法用于清除数据。两个定义都针对 books 缓存。
aop:config 定义通过使用 AspectJ 切入点表达式将缓存建议应用到程序的适当位置(有关更多信息,请参阅 使用 Spring 的面向方面的编程)。在前面的例子中,所有来自 BookService 的方法都会被考虑,并将缓存建议应用于它们。
声明式XML缓存支持所有基于注解的模型,因此在两者之间切换应该相当容易。此外,两者都可以在同一应用程序中使用。
基于XML的方法不会影响目标代码。然而,它本质上更加冗长。在处理具有重载方法的类时,这些方法被用于缓存,识别正确的方法需要额外的努力,因为method参数不是一个好的区分器。在这些情况下,您可以使用AspectJ切入点来挑选目标方法并应用适当的缓存功能。
但是,通过XML,更容易应用包或组或接口范围的缓存(再次由于AspectJ切入点)以及创建类似模板的定义(就像我们在前面的例子中通过cache:definitions cache属性定义目标缓存那样)。