2011-11-29 92 views
8

有时候需要知道拦截Guice中的方法调用的方法拦截器的顺序。一个简单的示例场景是使用guice-persist提供的@Transactional方法拦截器和一个自定义的@Retry方法拦截器。重试拦截器必须在事务拦截器之外运行,以确保重试不会在同一个事务中执行。如何在Guice中定义方法拦截器的顺序?

在Spring中,您可以使用拦截器的Ordered接口来确保事务拦截器在重试拦截器中执行。 Guice中有没有办法达到同样的效果?

回答

15

Guice按照它们的注册顺序调用拦截器。所以,如果你确定他们是这样的:

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

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

retryInterceptor将​​之前执行。

如果您有多个模块 - 第一个模块的拦截器在秒模块的拦截器等之前执行,则同样适用。

+0

这是一个非常有限的方法。如果您有一个模块设置了一些拦截器,并且您需要安装此模块并在模块安装的模块之间配置一个额外的拦截器,则无法执行此操作。 – BrunoJCM