如何使用它的param扩展java @Interface

时间:2017-11-03 14:59:32

标签: java spring annotations

在我有两个dataSource的spring boot应用程序中,

我需要使用@Transactional注释使用以下参数选择正确的dataSource:

  • 字符串value (必填)
  • 布尔readOnly (默认:false)

我想创建一个@interface所以我不必输入值(开发人员犯错的可能性就是激励决定)

所以这需要写在一个类中:

@Transactional("transactionManager2")

我创建了以下@interface

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transactionManager2")
public @interface TransactionManager2Tx {
}

此注释替换@Transactional("transactionManager2")并且运行良好。

但是,我无法传递其他参数。例如,这是不可能的:

@TransactionManager2Tx(readOnly = true)

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

通常 - 这是不可能的,因为注释的元素值是在编译时定义的。您无法在那里动态传递值。

但是,在Spring中,有一个棘手的注释类型@AliasFor

您可以尝试执行以下操作:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transactionManager2")
public @interface TransactionManager2Tx {

    @AliasFor(annotation = Transactional.class, attribute = "readOnly")
    boolean readOnly() default false;

}

如果它不起作用,您始终可以定义两个不同的注释,类型为:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value = "transactionManager2", readOnly = true)
public @interface ReadOnlyTransactionManager2Tx {
}

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value = "transactionManager2", readOnly = false)
public @interface NonReadOnlyTransactionManager2Tx {
}