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

Methods 如何在Guice中定义方法拦截器的顺序?,methods,aop,guice,interceptor,Methods,Aop,Guice,Interceptor,有时需要知道在Guice中拦截方法调用的方法拦截器的顺序。一个简单的示例场景是使用guice persist提供的@Transactional method拦截器和自定义@Retry method拦截器。重试侦听器必须在事务侦听器之外运行,以确保重试不会在同一事务中执行 在Spring中,您可以使用拦截器的有序接口来确保事务拦截器在重试拦截器中执行。有没有办法在Guice中实现同样的功能?Guice按照拦截器注册的顺序调用拦截器。如果你这样定义它们: bindInterceptor(any(),

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


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

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

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

retryInterceptor
将在
transactionalInterceptor
之前执行


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

这是一种非常有限的方法。如果您有一个模块设置了一些拦截器,并且您需要安装此模块并在该模块安装的拦截器之间配置一个额外的拦截器,则没有办法这样做。@BrunoJCM有一种方法可以使用及其访问者对其重新排序,您可以从您的模块中获取所有拦截器绑定的列表,对它们重新排序,然后使用这些新元素创建一个模块。我使用Order注释对多活页夹绑定进行了类似的排序。
bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor, transactionalInterceptor);