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

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

阅读 609
评论 2019-08-22 提问
    1 个回答
    mizhoux
    • 2.9k

    先说结论:如果一个方法上同时存在 @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>
    评论 赞赏