基于Spring AOP注释的ElementType.TYPE基于切入点?

时间:2014-03-25 22:09:14

标签: spring annotations aop

我有一个服务实现,它带有一个类范围的@Transactional注释。我还有一个方面使用@Around建议来重试失败的事务。我现在正在尝试(出于类型安全的原因)基于切入点定义注释:

@Around("@annotation(TransactionRetryable)")

TransactionRetryable.java:

    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.lang.annotation.ElementType;

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD, ElementType.TYPE})
    public @interface TransactionRetryable {
    }

服务层:

@Transactional
public class ... {
        @Override
        @TransactionRetryable
        public String forceError() {
            throw new RuntimeException(someNastyMessage);
        }

在该形式中,它仅适用于方法,而不适用于整个类。但是,@ Transactional注释从类级别传播到每个方法。有没有办法避免将@TransactionRetryable注释放在每个方法之上,而只是在类之上,就像@Transactional注释一样?期望的形式:

@Transactional
@TransactionRetryable
public class ... {
        @Override
        public String forceError() {
            throw new RuntimeException(someNastyMessage);
        }

1 个答案:

答案 0 :(得分:2)

此切入点会建议使用@TransactionRetryable注释的类的所有公共方法:

@Around("execution(public * *(..)) && within(@your.package.TransactionRetryable *)")