切入点或切面围绕所有带有注释的服务方法 @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..*.*(..))
是否可以使用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..*.*(..))