繁体   English   中英

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

Aspectj:从外部jar拦截方法

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

您要使用这样的切入点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM