我注意到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)
结尾处真正构造一切。
答案 0 :(得分:0)
取决于应用的范围和阶段。有一个链接到guice doc描述它http://code.google.com/p/google-guice/wiki/Scopes
好吧,如果你将 Bar.class 绑定为EagerSingleton,那么绑定类会立即实例化,因此应用程序启动会有点延长。
bind(Bar.class).toProvider(BarProvider.class).asEagerSingleton();
输出会有所不同
BarProvider constructed
Foo created by Guice
有三个阶段,您可以在 Guice.createInjector
期间设置它们Injector injector = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() {