【问题标题】:Spring @Transactional - synchronize via AspectJSpring @Transactional - 通过 AspectJ 同步
【发布时间】:2021-03-27 09:02:29
【问题描述】:

我正在尝试使用 AspectJ 同步声明性事务(即用 @Transactional 注释的方法),如下所示:

...
import org.aspectj.lang.annotation.Aspect;
...

@Component
@Aspect
public class TransactionMonitor extends TransactionSynchronizationAdapter {

    @Before("execution(@org.springframework.transaction.annotation.Transactional * *.*(..))")
    private void registerTransactionSynchronizationOnAnnotation(JoinPoint joinPoint) {
        TransactionSynchronizationManager.registerSynchronization(this);
    }
}

这当前失败并显示java.lang.IllegalStateException: Transaction synchronization is not active,这表明同步不是在事务执行内部运行,而是在之前运行。当然,我想确保这是相反的情况。

我找到了this answer,但是@Order(Ordered.LOWEST_PRECEDENCE)没有效果,并且

@DeclarePrecedence(
        "org.springframework.transaction.aspectj.AnnotationTransactionAspect, xxx.xxx.TransactionMonitor, *"
)

在启动期间导致此问题:

java.lang.IllegalArgumentException: DeclarePrecedence not presently supported in Spring AOP 

我觉得这是 AOP 和 AspectJ 彼此不满意,但我不确定。我很感谢任何想法。

编辑:我必须使用@EnableTransactionManagement(proxyTargetClass = true),这可能与问题有关吗?

【问题讨论】:

    标签: spring transactions aspectj spring-aop spring-transactions


    【解决方案1】:

    对于@DeclarePrecedence,您需要切换到本机 AspectJ。 Spring AOP 只是“AOP lite”,在技术上与 AspectJ 几乎没有共同之处,除了它的语法基本上是 AspectJ 的子集。 Spring手册描述了如何使用原生AspectJ in Spring via LTW (load-time weaving)。 Spring 组件的优先级声明使用@Order,顺便说一句。

    我根本不是 Spring 用户,但对于声明式事务管理,它已经知道基于代理的 Spring AOP 与原生 AspectJ 模式,参见EnableTransactionManagement.modeAdviceMode 中的枚举常量。此外,EnableTransactionManagement 还有一个order 属性。我猜阅读 Javadoc 和 Spring 手册会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2011-01-12
      相关资源
      最近更新 更多