现有注解的 AspectJ 表达式,切入点在注解之后但在方法执行之前
AspectJ Expression for an existing annotation, pointcut after annotation but before method execution
这是现有代码:
@Transactional
// <-- Want to Pointcut to here, after Transactional is done, before method execution
public String getUsername(int userId) {
...
}
尝试切入注释行,这是我目前尝试的方法:
@Around("@annotation(org.springframework.transaction.annotation.Transactional) " +
" && !target(org.springframework.transaction.interceptor.TransactionAspectSupport)")
public Object runQueryWithinTransaction(ProceedingJoinPointjp) throws Throwable {
...
}
还尝试将我的方面的顺序设置为 LowestPrecedence。尽管如此,我仍然看到我的方面在 Transactional 的 "invokeWithinTransaction" 方法之前被调用。尝试了“@After”,但它是在我的 "getUsername" 方法之后执行的。无缘无故地尝试了“@Before”,但这显然没有帮助。
我应该怎么做?
通过在我的方面设置优先级解决了这个问题:
@Aspect
@DeclarePrecedence("org.springframework.transaction.aspectj.AnnotationTransactionAspect, *")
public class MyAspect {
....
}
感谢@kriegaex,如果您不使用 AspectJ 和常规 Spring AOP,您应该尝试使用 @Ordered
和 @Order
注释。 @Order on Spring 可以在 @EnableTransactionManagement
注释中设置事务注释,并为您自己的方面设置较低的优先级(或完全 none,因为最低优先级是默认的)。
这是现有代码:
@Transactional
// <-- Want to Pointcut to here, after Transactional is done, before method execution
public String getUsername(int userId) {
...
}
尝试切入注释行,这是我目前尝试的方法:
@Around("@annotation(org.springframework.transaction.annotation.Transactional) " +
" && !target(org.springframework.transaction.interceptor.TransactionAspectSupport)")
public Object runQueryWithinTransaction(ProceedingJoinPointjp) throws Throwable {
...
}
还尝试将我的方面的顺序设置为 LowestPrecedence。尽管如此,我仍然看到我的方面在 Transactional 的 "invokeWithinTransaction" 方法之前被调用。尝试了“@After”,但它是在我的 "getUsername" 方法之后执行的。无缘无故地尝试了“@Before”,但这显然没有帮助。
我应该怎么做?
通过在我的方面设置优先级解决了这个问题:
@Aspect
@DeclarePrecedence("org.springframework.transaction.aspectj.AnnotationTransactionAspect, *")
public class MyAspect {
....
}
感谢@kriegaex,如果您不使用 AspectJ 和常规 Spring AOP,您应该尝试使用 @Ordered
和 @Order
注释。 @Order on Spring 可以在 @EnableTransactionManagement
注释中设置事务注释,并为您自己的方面设置较低的优先级(或完全 none,因为最低优先级是默认的)。