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

时间:2018-11-19 19:28:59

标签: java spring aop aspectj pointcut

是否可以使用Spring AOP或AspectJ来拦截所有具有注释的Service方法(包含在com.app.service.*包中的类中)

@Transactional(readOnly = false)

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

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

如果可以的话,我更喜欢使用直接Spring。

可能类似于以下内容,但不确定语法。

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

2 个答案:

答案 0 :(得分:0)

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

@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(休眠)。这将需要加载时编织或其他一些困难的解决方法。

this topic

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

答案 1 :(得分:0)

您要使用这样的切入点:

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