【问题标题】:AspectJ Expression for an existing annotation, pointcut after annotation but before method execution现有注释的 AspectJ 表达式,注释之后但方法执行之前的切入点
【发布时间】:2020-07-28 21:23:09
【问题描述】:

这是现有的代码:

@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。尽管如此,我仍然看到我的 Aspect 在 Transactional 的“invokeWithinTransaction”方法之前被调用。尝试了“@After”,但这是在我的“getUsername”方法之后执行的。无缘无故地尝试了“@Before”,但这显然没有帮助。

我应该怎么做?

【问题讨论】:

    标签: java annotations aop aspectj spring-annotations


    【解决方案1】:

    通过在我的方面设置优先级来解决这个问题:

    @Aspect
    @DeclarePrecedence("org.springframework.transaction.aspectj.AnnotationTransactionAspect, *")
    public class MyAspect {
        ....
    }
    

    感谢@kriegaex,如果您不使用AspectJ 和常规Spring AOP,您应该尝试使用@Ordered@Order 注释。 @Order on Spring Transactional annotation 可以在 @EnableTransactionManagement annotation 中设置,并为您自己的 Aspect 设置较低的优先级(或根本没有,因为最低优先级是默认的)。

    【讨论】:

    • 如果这有效,则意味着您使用的是 AspectJ(可能通过加载时织入代理)而不是 Spring AOP。它是否正确?在 Spring 项目的 AOP 相关问题的上下文中,您应该始终明确提及,因为大多数 Spring 用户的默认用例是使用内置 Spring AOP 作为“AOP lite”解决方案,除非他们需要高级 AspectJ 功能。对于 Spring AOP 方面的执行顺序可以通过 @Ordered@Order 注释更改,对于 AspectJ,您使用 @DeclarePrecedence。因此,您问题的正确答案取决于所使用的 AOP 框架。
    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2015-11-06
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多