2017-09-28 6 views
0

D'abord, considérons que nous avons le service CustomerRegister qui fait simplement son travail.Est-il possible de créer un Aspect qui fournit l'opération @AfterReturnin sur une méthode initialement annotée avec @Transaction?

@Service 
class CustomerRegister { 
    private final CustomerRegister customerRegister; 

    CustomerRegister(CustomerRegister customerRegister) { 
     this.customerRegister = customerRegister; 
    } 

    @Transactional 
    public void create(Customer customer) { 
     customerRegister.persist(customer); 
    } 
} 

Ensuite, il a été décidé qu'il serait peut-être bon d'avoir une métrique métier à propos de cette opération de registre. Le choix commun est d'utiliser org.springframework.boot.actuate.metrics.CounterService

Notez que:

En utilisant @Transactional, Spring crée dynamiquement un proxy qui implémente la même interface (s) comme la classe vous annoter

Si nous décidons d'invoquer

counterService.increment(REGISTY_METRIC); 

Dans le cadre de la méthode create, le compteur sera augmenté même si la transaction a été annulée.

Mon idée est de créer un aspect qui enveloppe que transactional proxy (qui enroulant service CustomerRegister d'origine). Ce composant @Aspect pourrait alors fournir une méthode annotée avec @AfterReturning(pointcut = ce compteur d'incrément .

Autres mots:

  1. Comment mettre en œuvre les aspects sur un autre aspect?
  2. Comment implémenter un aspect sur un proxy transactionnel?

Répondre

1

Implémentez l'aspect tel qu'il est fait normalement. Assurez-vous simplement que les aspects personnalisés @Order sont réglés sur une valeur faible (, c'est-à-dire la plus haute priorité, par exemple 1) afin qu'elle s'exécute avant tout autre aspect qui est l'aspect de la transaction dans ce cas.

Reportez-vous ci-dessous image (reference) pour comprendre graphiquement le flux de demandes. En définissant l'ordre approprié sur le custom advisor(s), il peut être exécuté avant/après l'avis de transaction sans aucune considération spéciale. lire here pour comprendre comment commander aspect est traité au printemps

Spring Transaction execution flow

supplémentaire recommandé.