Reputation: 193
Sometimes there's a need to know the order of method interceptors that intercept a method call in Guice. A simple example scenario would be to use guice-persist provided @Transactional method interceptor with a custom @Retry method interceptor. The retry interceptor must be run outside of the transactional interceptor to make sure the retries are not executed within the same transaction.
In Spring you could use the Ordered interface for the interceptor to make sure the transaction interceptor is executed within the retry interceptor. Is there a way to achieve the same in Guice?
Upvotes: 11
Views: 3203
Reputation: 646
Guice invokes the interceptors in the order in which they were registered. So if you define them something like this:
bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor);
bindInterceptor(any(), annotatedWith(Transactional.class), transactionalInterceptor);
or
bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor, transactionalInterceptor);
the retryInterceptor
will be executed before the transactionalInterceptor
.
Same applies if you have multiple modules - the interceptors from first module are executed before the interceptors of the seconds module and so on.
Upvotes: 20