试图让 AspectJ 切入点命中事务注释并引入变量

Trying to get an AspectJ Pointcut to hit on Transactional annotation AND bring in variables

这是有问题的代码。

@Aspect
@EnableAspectJAutoProxy
public class TransactionAspect extends TransactionSynchronizationAdapter {
   public TransactionMonitor transactionMonitor;    
   String message;

 @Before("execution(@org.springframework.transaction.annotation.Transactional * *.*(..)) && args(message,..))")
public void registerTransactionSynchronization(String message) {
    TransactionSynchronizationManager.registerSynchronization(this);
    this.message = message;
}

    public void setTransactionMonitor(TransactionMonitor transactionMonitor) {
    this.transactionMonitor = transactionMonitor;
}

我已经在我的 spring 配置文件中创建了这个 Aspect bean。

我最初在 @Before 块中有这个 @Before("@annotation(org.springframework.transaction.annotation.Transactional)")

这成功了。我有事务注释的地方会调用这个切入点。但是,我还需要来自我的方法的变量并将这方面放在上面。这就是 args(message) 出现的地方。我尝试了几种不同的方法来检索该消息(这是一个字符串)但无济于事。

有谁知道我如何制作这个切入点来点击事务性注释以及从我用事务性注释的方法中拉入变量吗?谢谢你。

您可以尝试使用 JoinPoint 来获取它的参数[1]:

@Before("@annotation(annotation)")
public void registerTransactionSynchronization(final JoinPoint jp, final Transactional annotation) {

    // These are the method parameters, yours would be at parameters[0], but check first... ;)
    final Object[] parameters = jp.getArgs(); 

    // Your stuff here       
}

在 JP 定义中使用 "args(message,...)" 可能也有效,但 IIRC 第一个参数需要是 JoinPoint 本身。因此,将其添加到方法签名中可能就足够了。

[1] http://www.eclipse.org/aspectj/doc/released/runtime-api/org/aspectj/lang/JoinPoint.html#getArgs()