先说结论:如果一个方法上同时存在 @Transactional 和 @Cacheable ,且没有指定事务切面和缓存切面的 Order,那么先执行 @Cacheable 对应的切面,再执行 @Transactional 对应的切面。 我们知道,在 Spring 里面,如果一个方法,存在多个切面,那么是按照切面的 Order 顺序来执行的:Order 值越小,那么切面越先执行(越后结束)。 @Transactional 和 @Cacheable 都是通过 AOP 来实现的,那就说明 @Transactional 和 @Cacheable 都对应了一个切面。如果不指定事务切面和缓存切面的 Order,它们的 Order 都将是默认值 —— Integer.MAX_VALUE,即最小优先级。如果两个切面 Order 相同,那么是按照切面的字母顺序来执行的切面。所以如果一个方法上同时存在 @Transactional(对应切面为 TransactionInterceptor)和 @Cacheable (对应切面为 CacheInterceptor),且如果没有指定事务切面和缓存切面的 Order,因为 CacheInterceptor 的字母顺序在 TransactionInterceptor 之前,所以先执行 @Cacheable 对应的切面,再执行 @Transactional 对应的切面。 那么如何指定缓存切面或者事务切面的 Order ? 使用注解: @EnableCaching(order = 1) @EnableTransactionManagement(order = 2) 使用 XML: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/aop/spring-tx-4.0.xsd"> <cache:annotation-driven order="1"/> <tx:annotation-driven order="2"/> </beans>
先说结论:如果一个方法上同时存在
@Transactional
和@Cacheable
,且没有指定事务切面和缓存切面的 Order,那么先执行@Cacheable
对应的切面,再执行@Transactional
对应的切面。我们知道,在 Spring 里面,如果一个方法,存在多个切面,那么是按照切面的 Order 顺序来执行的:Order 值越小,那么切面越先执行(越后结束)。
@Transactional
和@Cacheable
都是通过 AOP 来实现的,那就说明@Transactional
和@Cacheable
都对应了一个切面。如果不指定事务切面和缓存切面的 Order,它们的 Order 都将是默认值 —— Integer.MAX_VALUE,即最小优先级。如果两个切面 Order 相同,那么是按照切面的字母顺序来执行的切面。所以如果一个方法上同时存在@Transactional
(对应切面为TransactionInterceptor
)和@Cacheable
(对应切面为CacheInterceptor
),且如果没有指定事务切面和缓存切面的 Order,因为CacheInterceptor
的字母顺序在TransactionInterceptor
之前,所以先执行@Cacheable
对应的切面,再执行@Transactional
对应的切面。那么如何指定缓存切面或者事务切面的 Order ?
使用注解:
使用 XML: