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:
- Comment mettre en œuvre les aspects sur un autre aspect?
- Comment implémenter un aspect sur un proxy transactionnel?