2011-11-29 11 views
8

A volte è necessario conoscere l'ordine degli intercettatori di metodi che intercettano una chiamata di metodo in Guice. Uno scenario di esempio semplice sarebbe quello di utilizzare l'intercettatore del metodo @Transactional fornito da guice-persist con un intercettatore del metodo @Retry personalizzato. L'intercettatore dei tentativi deve essere eseguito all'esterno dell'intercettatore transazionale per assicurarsi che i tentativi non vengano eseguiti all'interno della stessa transazione.Come definire l'ordine degli intercettatori di metodo in Guice?

In primavera è possibile utilizzare l'interfaccia Ordinata per l'intercettore per assicurarsi che l'intercettatore di transazioni sia eseguito all'interno dell'intercettatore tentativi. C'è un modo per ottenere lo stesso risultato in Guice?

risposta

15

Guice invoca gli intercettatori nell'ordine in cui sono stati registrati. Quindi, se si definiscono loro qualcosa di simile:

bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor); 
bindInterceptor(any(), annotatedWith(Transactional.class), transactionalInterceptor); 

o

bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor, transactionalInterceptor); 

il retryInterceptor verrà eseguito prima della transactionalInterceptor.

Lo stesso vale se si dispone di più moduli: gli interceptor del primo modulo vengono eseguiti prima degli interceptor del modulo seconds e così via.

+0

È un approccio molto limitato. Se hai un modulo che imposta alcuni intercettori e devi installare questo modulo e configurare un intercettore aggiuntivo tra quelli installati dal modulo, non c'è modo di farlo. – BrunoJCM