2013-01-04 2 views
6

Я создаю свою собственную ярлык аннотацию, как описано в Spring Documentation:Весенняя пользовательская аннотация: как наследовать атрибуты?

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

Можно ли, что с моими аннотациями я мог бы также иметь возможность установить любые другие атрибуты, которые доступны в @Transactional? Я хотел бы возможность использовать свою аннотацию, например, так:

@CustomTransactional(propagation = Propagation.REQUIRED) 
public class MyClass { 

} 

ответ

4

Нет, это не будет работать, если вы хотите, дополнительные атрибуты, которые должны быть установлены на ваших самых аннотациях так:

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional(value = "Custom", readOnly = true, propagation = Propagation.REQUIRED) 
public @interface CustomTransactional { 
} 

раствор (плохо один :-)) мог бы определить несколько аннотаций с базовым набором случаев, которые вы видите для сценария:

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional(value = "Custom", readOnly = true, propagation = Propagation.REQUIRED) 
public @interface CustomTransactionalWithRequired { 
} 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional(value = "Custom", readOnly = true, propagation = Propagation.SUPPORTED) 
public @interface CustomTransactionalWithSupported { 
} 
+0

Да, я думал о таком сценарии, но я бы в конечном итоге с большим количеством аннотаций - для каждой комбинации разумном атрибута;) – Laimoncijus

+1

Да, Я так и думал, поэтому я назвал это плохим решением :-). не вижу другого варианта, кроме использования '@ Transactional', если это так, пользовательские аннотации стереотипов помогут, если у вас есть фиксированный набор атрибутов для ваших аннотаций. –

2

в (по крайней мере) Spring 4, вы можете сделайте это указав элемент внутри аннотаций, например:

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional(value = "Custom", readOnly = true) 
public @interface CustomTransactional { 
    Propagation propagation() default Propagation.SUPPORTED; 
} 

Источник: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-meta-annotations

Смежные вопросы