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
在您的情况下)的每个相同类型的参数将具有相同的值。
当我 运行 下面的代码时,我得到输出 "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
在您的情况下)的每个相同类型的参数将具有相同的值。