Guice: Избегайте ленивых инъекций - PullRequest
8 голосов
/ 13 февраля 2012

У меня есть класс Cache, который довольно дорого создать, но после этого он устанавливается как одноэлементный и внедряется в мой уровень обслуживания.

@Override
protected void configure() {            
    bind(Cache.class).in(Singleton.class);

    bind(Service.class).to(ServiceImpl.class).in(Singleton.class);      
}

@Inject
    public ServiceImpl(Cache cache){
        this.cache = cache;
    }

public Cache(){
//Expensive stuff
}

Моя проблема в том, что public () в Cache выполняется, только когда я пытаюсь получить доступ к одному из его методов

Могу ли я каким-то образом заставить объект создаваться при запуске сервера?

1 Ответ

16 голосов
/ 13 февраля 2012

Да, свяжите это, используя .asEagerSingleton():

bind(Service.class).to(ServiceImpl.class).asEagerSingleton(); 

Обратите внимание, что по этой ссылке Guice будет с нетерпением создавать все Singleton с, если выполняется на этапе PRODUCTION (он лениво создает их на этапе DEVELOPMENT для более быстрого развертывания теста). Вы можете указать Stage при создании Injector:

Injector injector = Guice.createInjector(Stage.PRODUCTION, new MyModule());
...