@Transactional 和 @Cacheable标注在同一个方法上,这俩对应的切面执行顺序?

@Transactional 和 @Cacheable都是通过切面实现的
那么如果他们注解同一个方法上,
切面执行的顺序是怎样的?

阅读 7.6k
1 个回答

先说结论:如果一个方法上同时存在 @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>
推荐问题
宣传栏