2011-11-29 20 views
8

Czasami istnieje potrzeba poznania kolejności metod przechwytujących, które przechwytują wywołanie metody w Guice. Prostym przykładem może być użycie dostarczonego przez guice-persist z użyciem metody przechwytywania metod @Transactional przy użyciu niestandardowego przechwytywacza metody RET. Przechwytywacz przechwytywania musi być uruchomiony poza operatorem przechwytywania transakcyjnego, aby upewnić się, że ponowne próby nie są wykonywane w ramach tej samej transakcji.Jak zdefiniować porządek przechwytujących metody w Guice?

Wiosną można użyć interfejsu Uporządkowany dla przechwytywacza, aby upewnić się, że przechwytywacz transakcji jest wykonywany w ramach przechwytywacza retry. Czy jest sposób na osiągnięcie tego samego w Guice?

Odpowiedz

15

Guice wywołuje przechwyty w kolejności, w jakiej zostały zarejestrowane. Więc jeśli zdefiniować im coś takiego:

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

lub

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

na retryInterceptor zostanie wykonany przed transactionalInterceptor.

To samo dotyczy, jeśli masz wiele modułów - przechwytywacze z pierwszego modułu są wykonywane przed interceptorami modułu sekundowego i tak dalej.

+0

To bardzo ograniczone podejście. Jeśli masz moduł, który ustawia niektóre przechwytywacze i musisz zainstalować ten moduł i skonfigurować dodatkowy przechwytywacz między tymi zainstalowanymi przez moduł, nie ma sposobu, aby to zrobić. – BrunoJCM