如何用它扩展java@Interface';s参数
在spring boot应用程序中,我有两个数据源 我需要使用带有以下参数的如何用它扩展java@Interface';s参数,java,spring,annotations,Java,Spring,Annotations,在spring boot应用程序中,我有两个数据源 我需要使用带有以下参数的@Transactional注释选择适当的数据源: 字符串值(必需) 布尔值只读(默认值:false) 我想创建一个@接口,这样我就不必键入值(开发人员犯错误的机会就是促使决策的原因) 所以这需要在类中编写: @Transactional("transactionManager2") 我已经创建了以下@接口: @Target({ElementType.METHOD, ElementType.TYPE}) @Rete
@Transactional
注释选择适当的数据源:
- 字符串<代码>值(必需)
- 布尔值
只读(默认值:false)
@接口
,这样我就不必键入值(开发人员犯错误的机会就是促使决策的原因)
所以这需要在类中编写:
@Transactional("transactionManager2")
我已经创建了以下@接口
:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transactionManager2")
public @interface TransactionManager2Tx {
}
此注释替换了@Transactional(“transactionManager2”)
,并且运行良好
但是,我无法传递其他参数。例如,这是不可能的:
@TransactionManager2Tx(readOnly = true)
如何实现这一点?一般来说-这是不可能的,因为注释的元素值是在编译时定义的。您不能在那里动态传递值 但是,在
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 {
}
查看我的下一次更新=))