是否可以使用Spring AOP或AspectJ来拦截所有具有注释的Service方法(包含在com.app.service.*
包中的类中)
@Transactional(readOnly = false)
(Spring的@Transactional
注释中也可能有其他元素,但我们只关心readOnly = false
)。
我只能找到与带有简单注释或@Annotation(value)
的切入点有关的示例。
如果可以的话,我更喜欢使用直接Spring。
可能类似于以下内容,但不确定语法。
@Around("execution(* com.app.service..*.*(..))" && @Transactional[??])
答案 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(休眠)。这将需要加载时编织或其他一些困难的解决方法。
但是,更糟糕的是,注释需要RetentionPolicy=RUNTIME
才能被Pointcuts“发现”。我们需要遍历每种方法,并将此规范添加到每个@Transactional
中。无法自动在应用程序中保留所有@Transactional
的运行时。
答案 1 :(得分:0)
您要使用这样的切入点:
execution(@org.springframework.transaction.annotation.Transactional(readOnly = false) * com.app.service..*.*(..))