Guice 隐式地为 AssistedInject 变量赋值

Guice implicitly assigns a value to AssistedInject variable

当我 运行 下面的代码时,我得到输出 "Bar got 1234"。 看起来 Guice 找不到 num2 的绑定,并隐式分配了 num1 的值。 这是 AssistedInject 功能的一部分吗?我在 wiki 中找不到任何关于此的提及。 将 num2 的类型更改为 float 会引发此异常(如我所料): "No implementation for java.lang.Float annotated with @com.google.inject.assistedinject.Assisted(value=) was bound."

class Foo {
  @Inject
  public Foo(@Assisted final int num1, final Bar bar) {}

  interface FooFactory {
    Foo create(final int num1);
  }
}

class Bar {
  @Inject
  public Bar(@Assisted final int num2) {
    System.out.println("Bar got " + num2);
  }
}

class BillingModule extends AbstractModule {
  @Override
  protected void configure() {
    install(new FactoryModuleBuilder().implement(Foo.class, Foo.class).build(Foo.FooFactory.class));
  }
}

public class App {
  public static void main(String[] args) {
    Injector injector = Guice.createInjector(new BillingModule());
    Foo.FooFactory fooFactory = injector.getInstance(Foo.FooFactory.class);
    fooFactory.create(1234);
  }
}

如果您查看辅助实现,您会发现它是一个 binding annotation

@BindingAnnotation
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Assisted {
  String value() default "";
}

标有绑定注解(@Assisted 在您的情况下)的每个相同类型的参数将具有相同的值。