2013-09-30 2 views
1

Я заметил, что 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).

ответ

0

Это зависит от применяемого scope и этап. Там есть ссылка на Guice документа, которые описывают его http://code.google.com/p/google-guice/wiki/Scopes

Ну, если вы свяжете Bar.class как EagerSingleton, затем связать классы instantized сразу, поэтому при запуске приложения немного затянут.

bind(Bar.class).toProvider(BarProvider.class).asEagerSingleton(); 

Выход будет отличаться

BarProvider constructed 
Foo created by Guice 

Есть три этапа, вы можете установить их в Guice.createInjector

Injector injector = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() { 
+0

'Bar' не может быть синглтон. – user716468

Смежные вопросы