如何在Guice中定义方法拦截器的顺序?

时间:2011-11-29 09:09:16

标签: methods aop guice interceptor

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

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

1 个答案:

答案 0 :(得分:18)

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

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

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

retryInterceptor将在transactionalInterceptor之前执行。

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