我注意到 Guice 可能会为提供者注入代理,并将实际提供者类的构造推迟到使用提供者时。
public static class Foo {
private final Provider<Bar> barProvider;
@Inject
public Foo(Provider<Bar> barProvider) {
this.barProvider = barProvider;
}
public Bar getBar() {
return barProvider.get();
}
}
public static class Bar {
@Inject
public Bar() {}
}
public static class BarProvider implements Provider<Bar> {
public BarProvider() {
System.out.println("BarProvider constructed");
}
@Override
public Bar get() {
return null;
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Bar.class).toProvider(BarProvider.class);
}
});
Foo foo = injector.getInstance(Foo.class);
System.out.println("Foo created by Guice");
foo.getBar();
}
输出是
Foo created by Guice
BarProvider constructed
这是否仅发生在提供者注入中,或者也可能发生在非提供者注入中?我知道当出现循环依赖时,Guice 确实需要使用代理。但我担心如果后者是真的,那么 Guice 不能保证一切都在Injector.getInstance(some_class)
.