2013-01-04 6 views
6

Je crée ma propre annotation de raccourci personnalisé, tel que décrit dans Spring Documentation:Annotation personnalisée printanière: comment hériter des attributs?

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

Est-il possible, avec mon annotation personnalisée que je pourrais être aussi en mesure de définir d'autres attributs, qui sont disponibles dans @Transactional? Je voudrais pouvoir utiliser mon annotation, par exemple, comme ceci:

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

} 

Répondre

4

Non, qui ne fonctionnera pas, si vous voulez des attributs supplémentaires qui devront être mis sur votre même annotation personnalisée de cette façon:

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

une solution (mauvaise :-)) pourrait être de définir plusieurs annotations avec l'ensemble de base de cas que vous voyez pour votre scénario:

@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

Oui, je pensais à ce scénario, mais je finirais avec annotations NOMBREUX - pour chaque combinaison d'attributs sensible;) – Laimoncijus

+1

Oui, Je le pensais, c'est la raison pour laquelle je l'ai mis comme une mauvaise solution :-). ne voyez pas d'autre option que d'utiliser '@ Transactional' lui-même si c'est le cas, les annotations stéréotypées personnalisées vous seront utiles si vous avez un ensemble fixe d'attributs pour vos annotations. –

2

(au moins) Spring 4, vous pouvez faites ceci par spécifiant l'élément à l'intérieur de l'annotation, par exemple:

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

Source: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-meta-annotations

Questions connexes