Guice方法拦截器不起作用

时间:2018-04-21 14:33:34

标签: java aop guice

注释

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD})
public @interface PublishMetric {
}

拦截

public class PublishMetricInterceptor implements MethodInterceptor {
  @Override
  public Object invoke(MethodInvocation methodInvocation) throws Throwable {
    System.out.println("invoked");
    return methodInvocation.proceed();
  }
}

Guice模块

public class MetricsModule extends AbstractModule {
  @Override
  protected void configure() {
    bindInterceptor(any(), annotatedWith(PublishMetric.class), new PublishMetricInterceptor());
  }

  @Provides
  @Singleton
  public Dummy getDummy(Client client) {
    return new Dummy(client);
  }
}

用法

public class Dummy {
  private final Client client;

  @Inject
  public Dummy(final Client client) {
    this.client = client;
  }

  @PublishMetric
  public String something() {
    System.out.println("something");
  }
}

我不确定为什么这个拦截器不起作用。 Guice AOP Wiki声明

  

实例必须由Guice通过@Inject-annotated或无参数构造函数创建。不可能对非Guice构造的实例使用方法拦截。

使用@Provides注释创建新的Object是否被认为是由Guice创建的实例?

1 个答案:

答案 0 :(得分:2)

你的引用是正确的:“不能对非Guice构造的实例使用方法拦截。”

因此,由于您在提供方法中调用new Dummy(),因此无效。

如果您使用

  bind(Dummy.class).asEagerSingleton();

确实如此。