切入点或切面围绕所有带有注释的服务方法 @Transactional(readOnly = false)

Pointcut or Aspect Around All Service Methods with Annotation @Transactional(readOnly = false)

是否可以使用Spring AOP或AspectJ来拦截所有具有注解

的Service方法(包含在com.app.service.*包中的类中)
@Transactional(readOnly = false)

(其他元素也可能在 Spring 的 @Transactional 注释中,但我们只关心 readOnly = false)。

我只能找到与带有简单注释的切入点相关的示例,或者 @Annotation(value)

如果可能的话,我的偏好是直接使用 Spring。

可能会像下面这样,但不确定语法。

@Around("execution(* com.app.service..*.*(..))" && @Transactional[??])

不幸的是,没有简单的方法可以做到这一点。即使我们有一个基于注释的切入点,例如

@Aspect
@Component
@EnableAspectJAutoProxy
public class WriteTransactionAspectBean {

    @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void test(org.springframework.transaction.annotation.Transactional t) {
        System.out.println("TEST");
    }

}

问题是注释不是我们自己的,它们来自外部 JAR (Hibernate)。这将需要加载时编织或其他一些困难的解决方法。

Aspectj: intercept method from external jar

但更糟糕的是,注释需要 RetentionPolicy=RUNTIME 才能被切入点 "discovered"。我们需要遍历每个方法并将此规范添加到每个 @Transactional。无法在应用程序中自动使所有 @Transactional 的运行时可保留。

您想使用这样的切入点:

execution(@org.springframework.transaction.annotation.Transactional(readOnly = false) * com.app.service..*.*(..))