2010-08-31 19 views
6

Je dois utiliser 3 gestionnaires de transactions différents dans ma webapp. J'ai donc écrit ma propre annotation selon le Spring reference (Section 10.5.6.3 Annotations personnalisées de raccourci).Comment prolonger Spring Annotation @Transactional

Une annotation (pour l'utilisation d'un TransactionManager spécifique) ressemble à ceci:

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

import org.springframework.transaction.annotation.Transactional; 

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


} 

Tout fonctionne bien quand annoter ma couche de service avec l'annotation @CustomerTX personnalisée. Mais je dois fournir plus d'options pour mon annotation, comme readonly = true, rollbackFor = et ainsi de suite. Comme vous ne pouvez pas "étendre" une annotation (j'ai juste besoin d'étendre l'annotation @Transactional de Spring), quelle est la bonne implémentation pour cela?

Répondre

3

Vous aurez à créer plusieurs annotations personnalisées, j'en ai peur, une pour chaque cas d'utilisation, annotant chacune avec l'annotation @Transactional exacte dont vous avez besoin.

Ou vous devrez écrire votre propre aspect dans AspectJ (étendre org.springframework.transaction.aspectj.AbstractTransactionAspect de spring-aspects.jar) pour créer votre propre logique de transaction.

+0

Voulez-vous dire vraiment que je dois écrire quelque chose comme ça (en supposant que je veux juste avoir mis la transaction en lecture seule): @Target ({ElementType.METHOD, ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Transactional (valeur = "client", readOnly = true) @interface publique CustomerTXReadonly { } Cela ne peut pas être la seule solution de travail ... –

+0

J'ai peur, parce que des limitations des annotations. Comme je l'ai dit: soit cela ou écrire vos propres aspects (que je préférerais) –

+0

Merci pour votre aide. Je vais essayer d'écrire mes propres aspects. Il est dommage que les annotations ne soient pas extensibles :( –

0

Au printemps 4, vous pouvez le faire. Comme indiqué dans le documentation

Les méta-annotations peuvent également être combinées pour créer des annotations composées. Par exemple, l'annotation @RestController de Spring MVC est composée de @Controller et @ResponseBody. En outre, les annotations composées peuvent éventuellement redéclarer des attributs à partir de méta-annotations pour permettre la personnalisation par l'utilisateur. Cela peut être particulièrement utile lorsque vous souhaitez exposer uniquement un sous-ensemble des attributs de la méta-annotation. Par exemple, l'annotation @SessionScope de Spring code en dur le nom de la portée en session, mais permet toujours la personnalisation du proxyMode.

@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Scope(WebApplicationContext.SCOPE_SESSION) 
public @interface SessionScope { 

    /** 
    * Alias for {@link Scope#proxyMode}. 
    * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}. 
    */ 
    @AliasFor(annotation = Scope.class) 
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; 

}