Я заметил, что Guice может вводить прокси-сервер для провайдера и откладывать конструкцию фактического класса провайдера до тех пор, пока не будет использован поставщик.Помогает ли 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
ли это происходит только с Provider инъекций, или это может произойти с помощью инъекций, не провайдер тоже? Я понимаю, что когда появляются круговые зависимости, Guice действительно нужно использовать прокси. Но я обеспокоен тем, что, если последнее верно, тогда Guice не может гарантировать, что все ДЕЙСТВИТЕЛЬНО построено в конце Injector.getInstance(some_class)
.
'Bar' не может быть синглтон. – user716468