注解
@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 注释创建新对象是否被视为由 Guice 创建的实例?
@Provides
,因为 Client 也是一个被注入的依赖项,Guice 会为你处理!此外,如果要使该类成为单例,可以在类声明中添加@Singleton
注解。 - HarishDummy
类中使用的Client
是一个依赖项,因为你已经用@Inject
注解了Dummy
类的构造函数,并且Client client
是它唯一的参数。像其他任何依赖项一样,你可以在你的Guice模块中指定类型Client
的绑定,这也可以使用@Provides
来实现。 - Harish